ACE-Top

导航

B - Marriage Ceremonies(DP)

/*其实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+++++\n",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-----\n",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\n",dp[n][(1<<n)-1]);
46         }
47     }
48 }

 

posted on 2013-08-17 20:06  ACE-Top  阅读(137)  评论(0编辑  收藏  举报