intさわだんのBlack History

刹那的レジェンドになりたい。

第9回日本情報オリンピック 本選 「お菓子の分割」

ヤバ問
解説は後ほど

#include <cstdio>
#include <algorithm>

using namespace std;

const int INF = 10000000;

int n,t[10003];
int dp[2][5101][2];

int main(){
  
  scanf("%d",&n);
  
  for(int i = 0;i < n-1;i++){
    scanf("%d",&t[i]);
  }
  
  for(int i = 0;i < 2;i++){
    for(int j = 0;j < 5100;j++){
      dp[i][j][0] = INF;
      dp[i][j][1] = INF;
    }
  }
  
  dp[0][0][0] = 0;
  for(int i = 0;i < n;i++){
    int m = min(5010,i);
    for(int j = 0;j <= m;j++){
      dp[(i+1)&1][j+1][0]=min(dp[i&1][j][0],dp[i&1][j][1]+t[i]);
			dp[(i+1)&1][j][1]=min(dp[i&1][j][1],dp[i&1][j][0]+t[i]);
		}
		dp[i&1][0][0]=INF;
	}
	printf("%d\n",dp[n%2][n/2][0]);
	return 0;
}