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