记录编号 23009 评测结果 AAAAAAWWWA
题目名称 打砖块 最终得分 70
用户昵称 GravatarPom 是否通过 未通过
代码语言 C++ 运行时间 0.772 s
提交时间 2011-02-23 13:43:54 内存使用 1.23 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

using namespace std;

const int MAXN=202;

int n,m,p,i,j,k,l,ans=0;
int f[MAXN][MAXN][3],chartA[MAXN][MAXN],chartB[MAXN][MAXN],sc[MAXN][MAXN];
bool b[MAXN][MAXN];
char ch;

int main()
{
	freopen("gamea.in","r",stdin);
	freopen("gamea.out","w",stdout);
	scanf("%d%d%d",&m,&n,&p);
	for (i=m;i>=1;i--)
		for (j=1;j<=n;j++)
		{
			scanf("%d %c",&sc[j][i],&ch);
			if (ch=='N') b[j][i]=false;
			else b[j][i]=true;
		}
	memset(chartA,0,sizeof(chartA));
	memset(chartB,0,sizeof(chartB));
	memset(f,0,sizeof(f));
	for (i=1;i<=n;i++)
	{
		k=0;
		for (j=1;j<=m;j++)
		{
			if (b[i][j]) chartA[i][k]+=sc[i][j];
			else chartA[i][++k]+=sc[i][j]+chartA[i][k-1];
		}
		k=0;
		for (j=1;j<=m;j++)
		{
			if (!b[i][j])
			{
				chartB[i][++k]+=sc[i][j]+chartB[i][k-1];
				for (l=j-1;b[i][l];l--)
					chartB[i][k]+=sc[i][l];
			}
		}
	}
	for (i=0;i<=p;i++)
		f[0][i][2]=-2000000000;
	for (i=1;i<=n;i++)
		for (j=0;j<=p;j++)
		{
			for (k=0;k<=j;k++)
			{
				if (k==p) continue;
				f[i][j][1]=max(f[i][j][1],f[i-1][j-k][1]+chartA[i][k]);
				f[i][j][2]=max(f[i][j][2],f[i-1][j-k][2]+chartA[i][k]);
				f[i][j][2]=max(f[i][j][2],f[i-1][j-k][1]+chartB[i][k]);
				if (f[i][j][1]>ans || f[i][j][2]>ans) ans=max(f[i][j][1],f[i][j][2]);
			}
		}
	int tot=0;
	for (i=1;i<=n;i++) tot+=chartA[i][0];
	for (i=1;i<=n;i++)
	{
		int t=tot,last=p;
		for (j=1;j<=m && last;j++)
			if (b[i][j]) t+=sc[i][j];
			else
			{
				t+=sc[i][j];
				last--;
			}
		if (t-chartA[i][0]>ans) ans=t-chartA[i][0];
	}
	printf("%d\n",ans);
	return 0;
}