为什么这样不MLE

P2704 [NOI2001] 炮兵阵地

_sry @ 2018-08-18 18:12:22

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define lowbit(x) x&-x
using namespace std;
inline int read()
{
    int f=1,ans=0;char c;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return ans*f;
}
int cont(int x)
{
    int c=0;
    while(x!=0)
    {
        x-=lowbit(x);
        c++;
    }
    return c;
}
int ans[1101];
int s[101][1101];
int n,m;
void init(int ha,int t)
{
    for(int i=0;i<=(1<<m)-1;i++) 
    {
        if(i&(i<<1)) continue;
        if(i&(i<<2)) continue;
        if(i&(i>>1)) continue;
        if(i&(i>>2)) continue;
        if(i&t) continue;
        s[ha][++ans[ha]]=i;
    }
    return;
}
int dp[101][1101][1101];
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)
    {
        char str;
        int t=0;
        for(int j=1;j<=m;j++) 
        {
            cin>>str;
            if(str=='P') t=(t<<1);
            else if(str=='H') t=(t<<1)+1;
        }
        init(i,t);
    }
    if(n==1) 
    {
        cout<<ans[1];
        return 0;
    }
    for(int i=1;i<=ans[2];i++)
    {
        for(int j=1;j<=ans[1];j++)
        {
            int s1=s[2][i],s2=s[1][j];
            if(s1&s2) continue;
            dp[2][i][j]=max(dp[2][i][j],cont(s1)+cont(s2));
        }
    }
    for(int i=3;i<=n;i++)
    {
        for(int j=1;j<=ans[i];j++)
        {
            for(int k=1;k<=ans[i-1];k++)
            {
                for(int t=1;t<=ans[i-2];t++)
                {
                    int s1=s[i][j],s2=s[i-1][k],s3=s[i-2][t];
                    if(s1&s2) continue;
                    if(s1&s3) continue;
                    if(s2&s3) continue;
                    dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][t]+cont(s1));

                }
            }
        }
    }
    int sum=0;
    for(int i=1;i<=ans[n];i++)
        for(int j=1;j<=ans[n-1];j++) 
        {
            if(s[n][i]&s[n-1][j]) continue;
            sum=max(sum,dp[n][i][j]);   
        }
    cout<<sum;
}
/*
5 4 
PHPP 
PPHH
PPPP 
PHPP 
PHHP
*/

by lwyz123 @ 2019-06-28 15:29:10

你在里面开个memset(dp,0,sizeof(dp))试试


|