zhangzhixu000001 @ 2024-07-16 11:33:37
代码如下:
#include <bits/stdc++.h>
using namespace std;
int dp[105][(1<<10)+5];
int sum[(1<<10)+5];
int getsum(int n)
{
int ans=0;
while(n)
{
if(n&1) ans++;
n>>=1;
}
return ans;
}
bool vis[105][15];
int main()
{
int n,m,lastrow=0,last_lastrow=0,ans;bool flag=0;cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char ch;cin>>ch;
vis[i][j]=(ch=='H');
}
}
dp[0][0]=1;
for(int i=0;i<(1<<m);i++) sum[i]=getsum(i);
for(int i=1;i<=n;i++)
{
flag=0;
for(int j=0;j<(1<<m);j++)
{
if(j&((j<<1)|(j>>1)|(j<<2)|(j>>2))) continue;
if(j&(lastrow|last_lastrow)) continue;
for(int k=1;k<=m;k++)
{
if(j&vis[i][k]) {flag=1;break;}
}
if(flag) break;
dp[i][j]+=(dp[i-1][lastrow]+sum[j]);
ans=j;
}
last_lastrow=lastrow;
lastrow=ans;
}
ans=0;
for(int i=0;i<(1<<m);i++) ans=max(ans,dp[n][i]);
cout<<ans;
return 0;
}
还有,题解区的巨佬们为什么要在dp[]里设置上一行的状态呢?个人认为只设这一行的状态也没问题啊?