POJ 1565(DP状态压缩)

本文详细介绍了一种使用状态压缩动态规划解决特定类型问题的方法。通过二进制标记状态,实现高效的状态转移,适用于需要处理组合状态的场景。文章提供了一个完整的C++代码示例,展示如何计算最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 int dp[2][1<<20], st[1<<20], map[20][20];
 5 int main()
 6 {
 7     int i, j, k, n, h, state, tmax;
 8     //用二进制标记状态(如:5(101)则符合要求)
 9     for(i = state = 0; i < (1<<20); ++i)
10         if((i & (i<<1)) == 0)
11             st[state++] = i;
12     while(scanf("%d", &n) != EOF){
13         for(i = 0; i < n; ++i)
14             for(j = 0; j < n; ++j)
15                 scanf("%d", &map[i][j]);
16         for(i = 0; i < (1<<n); ++i) dp[1][i] = 0;
17         for(k = 0; k < n; ++k){  //k行
18             h = k & 1;
19             for(i = 0; i < state; ++i){  //一共(1<<n)个状态
20                 if(st[i] >= (1<<n)) break;
21                 int sum = 0;
22                 for(j = 0; j < n; ++j)
23                     if(st[i] & (1<<j))
24                         sum += map[k][j]; //每行每个状态的和
25                 tmax = 0;
26                 for(j = 0; j < state; ++j){
27                     if(st[j] >= (1<<n)) break;
28                     if(!(st[i] & st[j]))      //上一行与本行匹配的最大值
29                         tmax = max(tmax, dp[1-h][st[j]]);
30                 }
31                 dp[h][st[i]] = tmax + sum;  //每行每个状态的最优解(本行+与上一行匹配的最大值)
32             }
33         }
34         tmax = 0;
35         h = (n-1) & 1;
36         for(i = 0; i < (1<<n); ++i) tmax = max(tmax, dp[h][i]);  //得到最优解
37         printf("%d\n", tmax);
38     }
39     return 0;
40 }

 

转载于:https://www.cnblogs.com/yaling/p/3209392.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值