求调&疑问

P2704 [NOI2001] 炮兵阵地

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[]里设置上一行的状态呢?个人认为只设这一行的状态也没问题啊?


|