Exber @ 2021-05-17 18:34:19
50 pts:
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,dp[2][10005][10005];
struct line
{
bool dat[15];
int num[10005],cnt[10005],sum;
}a[105];
void init(int wh,int pos,int now,int cnt)
{
if(pos>m)
{
a[wh].num[++a[wh].sum]=now;
a[wh].cnt[a[wh].sum]=cnt;
return;
}
init(wh,pos+1,now,cnt);
if(a[wh].dat[pos])
{
init(wh,pos+3,now|(1<<(pos-1)),cnt+1);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char ch;
scanf(" %c",&ch);
if(ch=='P')
{
a[i].dat[j]=true;
}
}
init(i,1,0,0);
}
for(int i=1;i<=a[1].sum;i++)
{
dp[1][i][0]=a[1].cnt[i];
}
for(int i=1;i<=a[1].sum;i++)
{
for(int j=1;j<=a[2].sum;j++)
{
if(a[1].num[i]&a[2].num[j])
{
continue;
}
dp[0][j][i]=dp[1][i][0]+a[2].cnt[j];
}
}
for(int i=3;i<=n;i++)
{
for(int j=1;j<=a[i].sum;j++)
{
for(int k=1;k<=a[i-1].sum;k++)
{
for(int l=1;l<=a[i-2].sum;l++)
{
if(
(a[i-1].num[k]&a[i-2].num[l])
||(a[i].num[j]&a[i-1].num[k])
||(a[i].num[j]&a[i-2].num[l])
)
{
continue;
}
dp[i%2][j][k]=dp[(i-1)%2][k][l]+a[i].cnt[j];
}
}
}
}
int ans=0;
for(int i=1;i<=a[n].sum;i++)
{
for(int j=1;j<=a[n-1].sum;j++)
{
ans=max(ans,dp[n%2][i][j]);
}
}
printf("%d\n",ans);
return 0;
}
求路过大佬帮忙找找 bug
by Exber @ 2021-05-17 18:35:36
之前的帖子沉下去了,一直找不到错就只好再发了一遍……
by Exber @ 2021-05-17 19:17:25
找到错了,状态转移时忘记取