Priori_Incantatem @ 2019-11-09 15:48:27
RT,程序食用样例后输出 4
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int Maxn=100+20,Maxm=20,Maxr=(1<<10)+20,inf=0x3f3f3f3f;
int a[Maxn],f[3][Maxr][Maxr],s[Maxr]; //s[i]储存状态i中有多少个炮兵
bool vis[Maxr]; //vis[i]储存状态i是否合法
int n,m,ms,ans;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
int main()
{
//freopen("in.txt","r",stdin);
n=read(),m=read(),ms=1<<m;
for(int i=1;i<=n;++i)
{
char opt[15];
scanf("%s",opt+1);
int len=strlen(opt+1);
for(int j=1;j<=m;++j)
{
a[i]<<=1;
if(opt[j]=='P')a[i]++;
}
}
for(int x=0;x<ms;++x)
{
if(x & (x<<1) || x & (x<<2)){vis[x]=1;}
for(int j=0;j<m;++j)
if((x>>j) & 1)s[x]++;
}
for(int x=0;x<ms;++x)
{
if(vis[x] || x & a[1])continue;
f[1][x][0]=s[x];
}
for(int x=0;x<ms;++x)
{
if(vis[x] || x & a[2])continue;
for(int y=0;y<ms;++y)
{
if(vis[y] || y & a[1] || x & y)continue;
f[2][x][y]=s[x]+s[y];
}
}
for(int i=3;i<=n;++i)
{
for(int x=0;x<ms;++x)
{
if(vis[x] || x & a[i])continue;
for(int y=0;y<ms;++y)
{
if(vis[y] || y & a[i-1]|| x & y)continue;
for(int z=0;z<ms;++z)
{
if(vis[z] || z & a[i-2] || x & z || y & z)continue;
f[i%3][x][y]=max(f[i%3][x][y],f[(i-1)%3][y][z]+s[x]);
}
}
}
}
for(int x=0;x<ms;++x)
{
if(vis[x] || x & a[n])continue;
for(int y=0;y<ms;++y)
{
if(vis[y] || y & a[n-1] || x & y)continue;
ans=max(ans,f[n%3][x][y]);
}
}
printf("%d\n",ans);
return 0;
}
by __ykl @ 2019-11-09 18:30:52
状态t与a[i]不冲突应该是(t | a[i])== a[i]吧
by __ykl @ 2019-11-09 18:33:53
或者输入那里应该改成
if(opt[j]=='H')a[i]++;
by Priori_Incantatem @ 2019-11-10 08:01:31
@刘开予2019
谢谢,AC了