样列老是7,不知到哪里错了

P2704 [NOI2001] 炮兵阵地

ioio0614 @ 2018-09-14 09:36:25

#include<bits/stdc++.h>

using namespace std;
int dp[55][1<<10][1<<10];
int s[1<<10],g[1<<10],top;
int mp[1<<10];
int get(int n)
{
    int ans=0;
    while(n)
    {
        if(n%2) ans++;
        n/=2;
    }
    return ans;
}

int main()
{
    int n,m;
    cin>>n>>m;
    top=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            char c;
            cin>>c;
            if(c=='H') mp[i]+=1<<j;
        }
    }

    for(int i=0;i<(1<<m);i++)
    {
        if(((i&(i<<1))==0)&&((i&(i<<2))==0)&&((i&(i>>1))==0)&&((i&(i>>2))==0))
        {
            s[top]=i;
            g[top]=get(i);
            if((mp[1]&i)==0)dp[1][0][top]=g[top];
            top++;
        }
    }
    ///for(int i=0;i<top;i++) cout<<s[i]<<" "<<g[i]<<endl;

    for(int i=0;i<top;i++)
    {
        for(int j=0;j<top;j++)
        {
            if(((s[j]&mp[2])==0)&&((s[i]&s[j])==0))
            {
                dp[2][i][j]=max(dp[2][i][j],dp[1][0][i]+g[j]);
            }
        }
    }

    for(int i=3;i<=n;i++)
    {
        for(int j=0;j<top;j++)
        {
            if((mp[i]&s[j])==0)
            {
                for(int p=0;p<top;p++)
                {
                    if((s[j]&s[p])==0)
                    {
                        for(int q=0;q<top;q++)
                        {
                            if(((s[q]&s[p])==0)&&((s[q]&s[j])==0))
                                dp[i][p][j]=max(dp[i][p][j],dp[i-1][q][p]+g[j]);
                        }
                    }
                }
            }
        }
    }
    int ans=0;
    for(int i=0;i<top;i++)
    {
        for(int j=0;j<top;j++)
            ans=max(ans,dp[n][i][j]);
    }
    cout<<ans<<endl;

}

|