Hdu 4539 状态压缩

来源:互联网 发布:天喜抽奖软件 编辑:程序博客网 时间:2024/05/12 16:34

直接做掉的状态压缩dp,但是数组开小了,WA了3次。。。。

#include<iostream>#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>using namespace std;int um[1001],state[10001],num;void getdp(int n){    num = 0;    for(int i=0;i<(1<<n);i++)        if((i&(i<<2) )== 0)        state[num++] = i;}int make_dp(int x){    int sum = 0;    while(x){        if(x % 2 == 1)sum++;        x /= 2;    }    return sum;}int dp[108][230][230];int main() {   int n,m,t;  // freopen("input.txt","r",stdin);        while(~scanf("%d%d",&n,&m)){                memset(um,0,sizeof(um));        for(int i=0;i<n;i++){            for(int j=0;j<m;j++){                scanf("%d",&t);                if(t == 0) um[i] = um[i]|(1<<j);            }        }        getdp(m);        memset(dp,-1,sizeof(dp));        for(int i=0;i<num;i++) {            if(um[0] & state[i])continue;            dp[0][i][0] = make_dp(state[i]);        }        for(int i=1;i<n;i++)        {            for(int j = 0;j<num;j++){                    if(um[i] & state[j])continue;                for(int k=0;k<num;k++){                    if(state[j]&(state[k]<<1))continue;                    if((state[j]<<1)&(state[k]))continue;                    for(int p=0;p<num;p++)                    {                        if(dp[i-1][k][p] == -1) continue;                        if((state[k]<<1) & state[p])continue;                        if(state[j]&(state[p]))continue;                        if((state[k]&(state[p]<<1)))continue;                        dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][p]+make_dp(state[j]));                    }                }            }        }        int ans = -1;        for(int i=0;i<num;i++)            for(int j=0;j<num;j++)            ans = max(ans,dp[n-1][i][j]);       printf("%d\n",ans);   }}


0 0