intさわだんのBlack History

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

第7回日本情報オリンピック 春合宿 2日目 「Nile.com」

典型DP
予選で出てもおかしくないレベルなので解説は割愛。

#include <○○○○>や、using namespace std;は省略することにしました。

const int INF = 1000000000;
int n,d;
int dp[400][3002][3];
int p[400][3002];
int main(){

	scanf("%d%d",&n,&d);
	for(int i = 0;i <= d;i++){
		for(int j = 0;j <= n;j++){
			for(int k = 0;k <= 2;k++)dp[i][j][k] = INF;
		}
	}
	for(int i = 1;i <= d;i++){
		for(int j = 1;j <= n;j++){
			scanf("%d",&p[i][j]);
		}
	}
	for(int i = 1;i <= n;i++){
		dp[1][i][0] = p[1][i];
	}
	for(int i = 2;i <= d;i++){
		int ki = INF;
		for(int j = 1;j <= n;j++){
			ki = min(min(ki,dp[i-1][j][0]),min(dp[i-1][j][1],dp[i-1][j][2]));
		}
		for(int j = 1;j <= n;j++){
			dp[i][j][0] = ki + p[i][j];
			dp[i][j][1] = dp[i-1][j][0] + (p[i][j] * 9 / 10);
			dp[i][j][2] = min(dp[i-1][j][1],dp[i-1][j][2]) + (p[i][j] * 7 / 10);
		}
	}

	int ans = INF;

	for(int i = 1;i <= n;i++){
		ans = min(min(ans,dp[d][i][0]),min(dp[d][i][1],dp[d][i][2]));
	}

	printf("%d\n",ans);

	return 0;
}