3 75 15 21 75 15 28 34 70 5
188
#include<stdio.h> #include<string.h> #define mulit(i) (1<<(i)) #define ll int #define N 16 ll dp[N][mulit(N)+1],sta[N][mulit(N)],sum[N][mulit(N)],sk[N],map[N][N]; void init(int n) { for(int i=0;i<n;i++) { sk[i]=0; for(int j=0;j<mulit(n);j++) { int e; sum[i][sk[i]]=0; for(e=0;mulit(e)<=j;e++) if(mulit(e)&j) { sum[i][sk[i]]+=map[i][e]; if((mulit(e-1)&j)&&e>0)break; } if(mulit(e)>j) {//printf("%I64d ",sta[i][sk[i]]); sta[i][sk[i]]=j; sk[i]++; }// } } } void count(int n) { memset(dp,0,sizeof(dp)); for(ll i=0;i<sk[0];i++) dp[0][i]=sum[0][i]; for(ll i=1;i<n;i++) for(ll j=0;j<sk[i];j++) for(ll tj=0;tj<sk[i-1];tj++) if((sta[i][j]&sta[i-1][tj])==0)//==优先级大于& if(dp[i][j]<dp[i-1][tj]+sum[i][j]) dp[i][j]=dp[i-1][tj]+sum[i][j]; } int main() { int n; while(scanf("%d",&n)>0) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]); init(n); count(n); ll max=0; for(ll i=0;i<sk[n-1];i++) if(dp[n-1][i]>max) max=dp[n-1][i]; printf("%d\n",max); } }
原文:http://blog.csdn.net/u010372095/article/details/38852013