记录编号 151105 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2013] 蚂蚁寻路 最终得分 100
用户昵称 GravatarChenyao2333 是否通过 通过
代码语言 C++ 运行时间 1.256 s
提交时间 2015-03-03 18:42:46 内存使用 127.29 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int L_N=100+10;
const int L_K=20+5;
const int INF=1e9;
int f[L_N][L_N][L_N][L_K],s[L_N][L_N],N,M,K;
int S(int j,int i1,int i2){
	//printf("j:%d i1:%d i2:%d ret:%d\n",j,i1,i2,s[j][i2]-s[j][i1-1]);
	return s[j][i2]-s[j][i1-1];
}
void set_max(int & a,int b){
	a=max(a,b);
}
int main(){
	//freopen("in.txt","r",stdin);
	freopen("zjoi13_ant.in","r",stdin);
	freopen("zjoi13_ant.out","w",stdout);
	scanf("%d %d %d",&N,&M,&K);
	for(int i=1;i<=N;i++) for(int j=1;j<=M;j++){
		int t; scanf("%d",&t);
		s[j][i]=t+s[j][i-1];
	}
	
	
	for(int i=0;i<=N;i++) for(int j=0;j<=M;j++){
		for(int h=0;h<=N;h++) for(int k=0;k<=2*K+1;k++){
			f[i][j][h][k]=-INF;
		}
	}
	
	for(int i=1;i<=N;i++) for(int j=1;j<=M;j++){
		for(int h=1;h<=i;h++) f[i][j][h][1]=S(j,h,i);
	}
	
	for(int k=1;k<=2*K+1;k++){
		for(int j=1;j<=M;j++){
			for(int i=1;i<=N;i++){
				if(k%2){
					int mx=-INF;
					for(int h=i;h>=1;h--){
						int ad=S(j,h,i);
						set_max(f[i][j][h][k],f[i][j-1][h][k]+ad);
						set_max(f[i][j][h][k],mx+ad);
						set_max(mx,f[i][j-1][h][k-1]);
					}
				}else {
					int mx=-INF;
					for(int h=1;h<=i;h++){
						int ad=S(j,h,i);
						set_max(f[i][j][h][k],f[i][j-1][h][k]+ad);
						set_max(f[i][j][h][k],mx+ad);
						set_max(mx,f[i][j-1][h][k-1]);
					}
				}
			}
		}
	}
	
	int ans=-INF;
	for(int i=1;i<=N;i++) for(int j=1;j<=M;j++){
		for(int h=1;h<=i;h++){
			/*if(f[i][j][h][2*K+1]>ans){
				printf("f[%d][%d][%d][%d]=%d\n",i,j,h,2*K+1,f[i][j][h][2*K+1]);
			}*/
			set_max(ans,f[i][j][h][2*K+1]);
		}
	}
	
	printf("%d\n",ans);
	return 0;
}