1 solutions
-
0
C++ :
#include<iostream> #include<cstdio> using namespace std; const int MAXN=201; int a[MAXN][MAXN]; int by[MAXN][MAXN],bn[MAXN][MAXN]; int sy[MAXN][MAXN],sn[MAXN][MAXN]; char c[MAXN][MAXN]; /*sn[j][i]:第j列打i发子弹,最后一个子弹打第j列的砖块。 sy[j][i]:第j列打i发子弹,最后一个子弹不打第j列的砖块。 bn[j][i]:前j列打i发子弹,最后一个子弹打第j列的砖块 。 by[j][i]:前j列打i发子弹,最后一个子弹不打第j列的砖块.*/ int main() { //freopen("game.in","r",stdin); //freopen("gamea.out","w",stdout); int N,M,K; scanf("%d%d%d",&N,&M,&K); for(int i=1;i<=N;i++) { for(int j=1;j<=M;j++) { scanf("%d %c",&a[i][j],&c[i][j]); } } for (int i=1;i<=M;++i)//循环处理第几列 { int t=N;//t为行数 while (t>0 && c[t][i]=='Y') //如果第一个砖块是Y,那么相当于不用耗费子弹即可向上打 { sy[i][0]+=a[t][i]; t--;//打掉这一层的砖块即可向上打 } //把刚开始Y砖块打完后,则下面没有砖块,从最后为Y的砖块的上一层开始 for (int j=1;j<=N && t>0;++j) { sn[i][j]=sy[i][j-1]+a[t][i];//第i列 sy[i][j]=sn[i][j]; t--; while (t>0 && c[t][i]=='Y') //如果砖块是Y,那么相当于不用耗费子弹即可向上打 { sy[i][j]+=a[t][i]; t--; //打掉这一层的砖块即可向上打 } } } /*for(int i=1;i<=M;++i) { for(int k=0;k<=K;++k) { printf("%3d",sy[i][k]); } printf("\n"); } printf("sy————————\n"); for(int i=1;i<=M;++i) { for(int k=0;k<=K;++k) { printf("%3d",sn[i][k]); } printf("\n"); } printf("sn————————\n");*/ /*for(int i=1;i<=M;++i) { for(int k=1;k<=K;++k) { s[i][k]=s[i][k-1]+a[N-k+1][i]; } }*/ for(int j=1;j<=M;++j) { for(int i=0;i<=K;++i) { for(int k=0;k<=N;++k) { if (k<=i) { int tmp=by[j-1][i-k]+sy[j][k]; if (tmp>by[j][i]) by[j][i]=tmp; if (k<i) { tmp=bn[j-1][i-k]+sy[j][k]; if (tmp>bn[j][i]) bn[j][i]=tmp; } if (k>0) { tmp=by[j-1][i-k]+sn[j][k]; if (tmp>bn[j][i]) bn[j][i]=tmp; } } } } } /*for(int i=1;i<=M;++i) { for(int k=0;k<=K;++k) { printf("%3d",by[i][k]); } printf("\n"); } printf("by————————\n"); for(int i=1;i<=M;++i) { for(int k=0;k<=K;++k) { printf("%3d",bn[i][k]); } printf("\n"); } printf("bn————————\n");*/ printf("%d",bn[M][K]); return 0; }
- 1
Information
- ID
- 727
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By