比赛 20140425 评测结果 AAAAAATTTT
题目名称 积木游戏 最终得分 60
用户昵称 cstdio 运行时间 5.145 s
代码语言 C++ 内存使用 2.44 MiB
提交时间 2014-04-25 12:07:27
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<fstream>
#include<vector>
using namespace std;
const int SIZEN=65,INF=0x7fffffff/2;
int N,M,K;
int board[SIZEN][SIZEN]={0};
int linepre[SIZEN][SIZEN]={0};
int f[2][SIZEN][SIZEN][SIZEN]={0};
void DP(void){
	int ans=0;
	memset(f[0],0,sizeof(f[0]));
	for(int i=1;i<=N;i++){
		int ps=(i&1);
		memset(f[ps],0,sizeof(f[0]));
		//for(int i=1;i<=N;i++) cout<<linepre[1][i]<<" ";cout<<endl;
		for(int j=1;j<=M;j++){
			for(int k=j;k<=M;k++){
				for(int nm=1;nm<=min(M*N-K,i*M);nm++){
					for(int j1=1;j1<=M;j1++){
						if(j1>k) continue;
						for(int k1=j1;k1<=M;k1++){
							if(k1<j) continue;
							if(i>=2&&nm-(k-j+1)-(k1-j1+1)<i-2) continue;
							if(i==1&&nm-(k-j+1)<0) continue;
							//if(nm-(k-j+1)<0) continue;
							f[ps][j][k][nm]=max(f[ps][j][k][nm],f[ps^1][j1][k1][nm-(k-j+1)]+linepre[i][k]-linepre[i][j-1]);
							//if(f[ps][j][k][nm]==7+16) cout<<i<<" "<<j<<" "<<k<<" "<<nm<<" "<<f[ps][j][k][nm]<<endl;
							//if(i==1) cout<<i<<" "<<j<<" "<<k<<" "<<nm<<" "<<f[ps][j][k][nm]<<endl;
						}
					}
					//cout<<i<<" "<<j<<" "<<k<<" "<<nm<<" "<<f[ps][j][k][nm]<<endl;
					if(nm==M*N-K) ans=max(ans,f[ps][j][k][nm]);
				}
			}
		}
	}
	printf("%d\n",ans);
}
void read(void){
	scanf("%d%d%d",&N,&M,&K);
	for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) scanf("%d",&board[N+1-i][j]);
	for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) linepre[i][j]=linepre[i][j-1]+board[i][j];
	//for(int i=1;i<=M;i++) cout<<linepre[1][i]<<" ";cout<<endl;
}
int main(){
	freopen("bricka.in","r",stdin);
	freopen("bricka.out","w",stdout);
	int T,kase=0;
	scanf("%d",&T);
	while(T--){
		read();
		printf("Case %d:",++kase);
		DP();
	}
	return 0;
}