• hdu 1565


     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<queue>
     6 #include<math.h>
     7 #include<algorithm>
     8 
     9 #define maxx 1<<21
    10 using namespace std;
    11 
    12 int mat[22][22],n,dp[22][60002],valid[60002];
    13 
    14 int sum(int p,int k,int n) // 第p层  状态k   共n层
    15 {
    16     int m=1<<n;
    17     int ans=0;
    18     for(int i=0; i<n; i++)
    19         if(k&(1<<i))//{printf("1<<i  %d %d 
    ",i,1<<i);
    20             ans+=mat[p][n-i-1];//}
    21     return ans;
    22 }
    23 
    24 void getnum()
    25 {
    26     int num=0;
    27     for(int i=0; i<maxx; i++)
    28         if((i&(i<<1))==0)
    29             valid[num++]=i;
    30 }
    31 
    32 int solve()
    33 {
    34     int final1=0;
    35     int m=(1<<n);
    36     memset(dp,-1,sizeof(dp));//  前i层   且i层状态为 j  获得的 最大的
    37     for(int i=0; valid[i]<m; i++)
    38     {
    39         dp[0][valid[i]]=sum(0,valid[i],n);
    40         //printf("temp   %d %d  %d
    ",valid[i],sum(0,valid[i],n),dp[0][valid[i]]);
    41     }
    42 
    43     for(int i=1; i<n; i++)
    44     {
    45         for(int j=0; valid[j]<m; j++) //状态 valid[j]
    46         {
    47             for(int k=0; valid[k]<m; k++)
    48             {
    49                 if(dp[i-1][valid[k]]!=-1&&(valid[j]&valid[k])==0)
    50                 {
    51                     if(dp[i][valid[j]]==-1)
    52                         dp[i][valid[j]]=dp[i-1][valid[k]]+sum(i,valid[j],n);
    53                     else
    54                         dp[i][valid[j]]=max(dp[i][valid[j]],dp[i-1][valid[k]]+sum(i,valid[j],n));
    55 
    56                 }
    57             }
    58         }
    59     }
    60 
    61     for(int i=0; valid[i]<m; i++)
    62     {
    63         if(final1<dp[n-1][valid[i]])
    64             final1=dp[n-1][valid[i]];
    65     }
    66 
    67 
    68     return final1;
    69 }
    70 
    71 int main()
    72 {
    73     getnum();
    74     while(~scanf("%d",&n))
    75     {
    76         for(int i=0; i<n; i++)
    77             for(int j=0; j<n; j++)
    78                 scanf("%d",&mat[i][j]);
    79         if(n==0)
    80             printf("0
    ");
    81         else
    82             printf("%d
    ",solve());
    83 
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    phpcms v9模板制作常用代码集合
    phpcms v9模板制作教程
    cookie 和session 的区别
    PHP的加密方式
    php基础
    复习 语句
    empty 和 isset的区别和联系
    MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
    ThinkPHP增删改查--改
    使用ajax提交form表单,包括ajax文件上传
  • 原文地址:https://www.cnblogs.com/assult/p/3740180.html
Copyright © 2020-2023  润新知