比赛 |
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;
}