/*其实DP题最重要的就是找到状态 转移 方程,懂得这写再刷刷水体=题加深印象,应该没什么问题了;*/
这道水题着实让我一阵痛啊!!
1 #include<stdio.h> 2 # define N (1<<16) +100 3 4 int dp[20][N]; 5 int max (int x,int y) 6 { 7 return x>y?x:y; 8 } 9 int main () 10 { 11 int T,i,j,n,a[20][20],p; 12 while(scanf("%d",&T)!=EOF) 13 { 14 for(p=1;p<=T;p++) 15 { 16 scanf("%d",&n); 17 for(i=1;i<=n;i++) 18 { 19 for(j=1;j<=n;j++) 20 { 21 scanf("%d",&a[i][j]); 22 } 23 } 24 for( i = 1; i <= n; i++) 25 for( j = 1; j <=(1<<n); j++) dp[i][j] = -1; 26 for(i=1;i<=n;i++)dp[1][1<<(i-1)]=a[1][i]; 27 for(i=2;i<=n;i++) 28 { 29 for(j=0;j<(1<<n);j++) 30 { 31 //printf("-----%d+++++ ",j); 32 if(dp[i-1][j]!=-1) 33 { 34 for(int k=1;k<=n;k++) 35 { 36 if(!(j&(1<<(k-1)))) 37 { 38 //printf("+++++%d----- ",1<<k-1); 39 dp[i][j|(1<<(k-1))]=max(dp[i][j|(1<<(k-1))],dp[i-1][j]+a[i][k]); 40 } 41 } 42 } 43 } 44 }printf("Case %d:",p); 45 printf(" %d ",dp[n][(1<<n)-1]); 46 } 47 } 48 }