记录编号 199857 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2009]道路游戏 最终得分 100
用户昵称 Gravatar0 是否通过 通过
代码语言 C++ 运行时间 1.418 s
提交时间 2015-10-27 17:34:26 内存使用 11.97 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>

#define maxn 1010

using namespace std;

int n,m,p,f[maxn],G[maxn][maxn],c[maxn],w[maxn][maxn],maxw[maxn][maxn];

int MAX(int a,int b){ return a>b?a:b; }

int W(int x){
	return x%n==0?n:x%n;
}

int main()
{
	freopen("roadgame.in","r",stdin);
	freopen("roadgame.out","w",stdout);
	memset(maxw,-0x3f,sizeof(maxw));
	scanf("%d%d%d",&n,&m,&p);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&G[i][j]);
		}
	}
	for(int i=1;i<=n;i++)   scanf("%d",&c[i]);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			w[j][j]=G[i][j];
			maxw[j][j]=MAX(maxw[j][j],w[j][j]-c[i]);
			for(int k=j+1;k<=m;k++){
				w[j][k]=w[j][k-1]+G[W(i+k-j)][k];
				maxw[j][k]=MAX(maxw[j][k],w[j][k]-c[i]);
			}
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=i-p<0?0:i-p;j<i;j++){
			f[i]=MAX(f[i],f[j]+maxw[j+1][i]);
		}
	}
	printf("%d",f[m]);
	return 0;
}