hdu 4539

#include<stdio.h>
#include<string.h>
int dp[2][202][202];
int s[202],c[202],origmap[202];
int main() {
    int i,j,n,m;
    int  ch;
    while(scanf("%d%d",&n,&m)!=EOF) {
        memset(origmap,0,sizeof(origmap));
        memset(s,0,sizeof(s));
        memset(c,0,sizeof(c));
        for(i=0;i<n;i++) {
            getchar();
                for(j=0;j<m;j++) {
                    scanf("%d",&ch);
                    if(ch==0)
                        origmap[i]+=(1<<j);
                }
        }
                int num=0;
                for(i=0;i<(1<<m);i++) {
                    int t=i;
                    if(i&(i<<2))
                        continue;
                    c[num]=t%2;
                    while(t=(t>>1)) 
                        c[num]+=t%2;
                    s[num++]=i;
                }
                memset(dp,-1,sizeof(dp));
                int roll=0;
                for(i=0;i<n;i++) {
                    for(j=0;j<num;j++) {
                        if(s[j]&origmap[i])
                            continue;
                        if(i==0)
                        dp[roll][j][0]=c[j];    
                        else {
                            for(int k=0;k<num;k++) {
                                if((s[j]&(s[k]<<1))||(s[j]&(s[k]>>1)))
                                    continue;
                                for(int l=0;l<num;l++) {
                                    if(s[j]&s[l])
                                        continue;
                                    if(s[k]&(s[l]<<1))
                                        continue;
                                    if(s[k]&(s[l]>>1))
                                        continue;
                                    if(dp[(roll+1)%2][k][l]==-1)
                                        continue;
                                    if(dp[roll][j][k]<dp[(roll+1)%2][k][l]+c[j])
                                        dp[roll][j][k]=dp[(roll+1)%2][k][l]+c[j];
                                }
                            }
                        }
                    }
                    roll=(roll+1)%2;
                }
                int max=0;
                roll=(roll+1)%2;
                for(i=0;i<num;i++)
                    for(j=0;j<num;j++)
                        if(max<dp[roll][i][j])
                            max=dp[roll][i][j];
                        printf("%d\n",max);
    }
    return 0;
}


posted @ 2013-08-14 20:30  HYDhyd  阅读(190)  评论(0编辑  收藏  举报