hdu 1565 状态压缩dp

#include<stdio.h>
#include<string.h>
int Max(int a,int b) {
    return a>b?a:b;
}
int  dp[3][1<<21];
int map[30][30];
int s[1<<21];
int main() {
    int i,j,k,n,num=0;
    for(i=0;i<(1<<21);i++)
         if(!(i&(i<<1)))
             s[num++]=i;
         while(scanf("%d",&n)!=EOF) {
            int  limit=1<<n;
             for(i=0;i<n;i++)
                 for(j=0;j<n;j++)
                     scanf("%d",&map[i][j]);
                 memset(dp,0,sizeof(dp));
                 int p=0;
                 for(i=0;i<n;i++) {
                     p^=1;
                     for(j=0;j<num;j++) {
                         int sum=0;
                         if(s[j]>limit)
                        break;
                         for(k=0;k<n;k++)
                             if(s[j]&(1<<k))
                                   sum+=map[i][k];
                             for(k=0;k<num;k++) {
                                 if(s[k]>limit)
                                break;
                                 if(!(s[j]&s[k]))
                                     dp[p][s[j]]=Max(dp[p][s[j]],dp[1-p][s[k]]+sum);
                             }
                     }
                 }
                 int max=0;
                 for(i=0;i<num&&s[i]<=limit;i++)
                     max=Max(max,dp[p][s[i]]);
                 printf("%d\n",max);
         }
         return 0;
}

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