zoukankan      html  css  js  c++  java
  • 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
    ",max);
        }
        return 0;
    }
    
    

  • 相关阅读:
    [题解]Magic Line-计算几何(2019牛客多校第三场H题)
    [题解]Crazy Binary String-前缀和(2019牛客多校第三场B题)
    [数论]快速幂取模
    [模板]大整数乘法——累加型
    [动态规划] 最大子段和问题
    2073
    17-2-24-D
    17-1-31-C
    2032
    1992
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410995.html
Copyright © 2011-2022 走看看