为什么样例都过不了,救命

P2704 [NOI2001] 炮兵阵地

lc_lca @ 2019-03-28 23:20:28

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
bool in_s[1<<11];
int c[1<<11];
bool valid[110][1<<11];
int dp[110][1<<11][1<<11];
int n,m;
char a[110][110];
int main()
{
    memset(in_s,false,sizeof(in_s));
    memset(valid,false,sizeof(valid));
    memset(dp,0,sizeof(dp));
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>a[i][j];
        }
    }
    for(int i=0;i<1<<m;i++)
    {
        int cnt_1=0;
        for(int j=0;j<m;j++)
        {
            if((i>>j)&1)
            {
                cnt_1++;
            }
        }
        c[i]=cnt_1;
    }
    for(int i=0;i<1<<m;i++)
    {
        int tmp=0;
        int cnt=0;
        bool ok=true;
        for(int j=0;j<m;j++)
        {
            if((i>>j)&1)
            {
                if(!tmp)
                {
                    tmp=1;
                }
                else
                {
                    if(cnt<2)
                    {
                        ok=false;
                    }
                }
                cnt=0;
            }
            else
            {
                cnt++;
            }
        }
        in_s[i]=ok;
    }
    for(int i=0;i<1<<m && in_s[i];i++)
    {
        for(int j=0;j<n;j++)
        {
            bool ok=true;
            for(int k=0;k<m;k++)
            {
                if((i>>k)&1 && a[j][m-1-k]=='H')
                {
                    ok=false;
                }
            }
            valid[j][i]=ok;
        }
    }
    dp[0][0][0]=0;
    for(int i=2;i<n;i++)
    {
        for(int j=0;j<1<<m && in_s[j];j++)
        {
            for(int k=0;k<1<<m && in_s[k];k++)
            {
                if(valid[i][j] && valid[i-1][k] && (j&k)==0)
                {
                    for(int l=0;l<1<<m && in_s[l];l++)
                    {
                        if((j&l)==0)
                        {
                            dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]);
                        }
                    }
                    dp[i][j][k]+=c[j];
                }
                else
                {
                    dp[i][j][k]=-inf;
                }
            }
        }
    }
    int ans=-inf;
    for(int i=0;i<1<<m && in_s[i];i++)
    {
        for(int j=0;j<1<<m && in_s[j];j++)
        {
            if((i&j)==0 && valid[n-1][i] && valid[n-2][j])
            {
                ans=max(ans,dp[n-1][i][j]); 

            }
        }
    }
    cout<<ans<<endl;    
    return 0;
}

|