记录编号 412676 评测结果 AAAAAAAAAA
题目名称 [NOI 2001]炮兵阵地 最终得分 100
用户昵称 Gravatarswttc 是否通过 通过
代码语言 C++ 运行时间 0.151 s
提交时间 2017-06-09 20:11:13 内存使用 5.48 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>

using namespace std;

char ma[110][20];
int n,m,s[110][110],sc[110],num[110][110];
int f[110][110][110];

void dfs(int lie,int hang,int zt,int cnt,int efc)
{
	if(lie==m+1)
	{
		s[hang][++sc[hang]]=zt;
		num[hang][sc[hang]]=cnt;
		return;
	}
	if(ma[hang][lie]=='P')
	{
		dfs(lie+1,hang,zt<<1,cnt,efc+1);
		if(efc>=2) dfs(lie+1,hang,(zt<<1)+1,cnt+1,0);
	}
	else
	{
		dfs(lie+1,hang,zt<<1,cnt,efc+1);
	}
}

int main()
{
	freopen("cannon.in","r",stdin);
	freopen("cannon.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=m;j++)
	 {
	 	cin>>ma[i][j];
	 }
	for(int i=1;i<=n;i++)
	{
		dfs(1,i,0,0,2);
	}
	for(int i=1;i<=sc[1];i++)
	{
		f[1][i][0]=num[1][i];
	}
	for(int i=1;i<=sc[2];i++)
	 for(int j=1;j<=sc[1];j++)
	{
		if(s[2][i]&s[1][j]) continue;
		f[2][i][j]=max(f[2][i][j],f[1][j][0]+num[2][i]);
	}
	for(int i=3;i<=n;i++)
	 for(int k=1;k<=sc[i];k++)
	  for(int l=1;l<=sc[i-1];l++)
	   for(int j=1;j<=sc[i-2];j++)
	   {
	   		if((s[i][k]&s[i-1][l])||(s[i][k]&s[i-2][j])||(s[i-1][l]&s[i-2][j])) continue;
	   		f[i][k][l]=max(f[i][k][l],f[i-1][l][j]+num[i][k]);
	   }
	int ans=-1e9;
	for(int i=1;i<=sc[n];i++)
	 for(int j=1;j<=sc[n-1];j++)
	 {
		ans=max(ans,f[n][i][j]);
	 }
	printf("%d",ans);
	return 0;
}