B - Marriage Ceremonies(DP)

本文深入探讨了动态规划(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 }

 

转载于:https://www.cnblogs.com/ace-top/p/3265042.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值