状态压缩DP一瞥【初识】
文章目录
- 先上菜
- 观察
- 思路
- 甜点
先上菜
经典例题
题目的意思是,这里有n个汉堡,每个汉堡都有价值value和花费cost,另外,每个汉堡的制作有一些依赖关系,必须要先制作某些汉堡之后才能制作这个汉堡,求最大价值。
观察
观察数据范围我们发现,n<= 15,215=32,768,注意到这里我们每个汉堡最多制作一个,我们利用0和1表示我们制作汉堡的情况。
思路
我觉得,状态压缩dp,与其说dp更是有种暴力的味道。首先我们初始化状态数组为-1。状态压缩dp我们要考虑最开始的状态。我们不做汉堡,000000000的状态下,f[0] = 0。就像一棵树一样,这是所以状态的根,就像网络流里的超级源点,一切的一切都从这个零开始。我们每次做汉堡都会使得1 增多,向更大的状态转移,例如000->100, 010, 001,不断地向后生长,开枝散叶。如果说遍历到当前的状态是-1则说明不存在合法的状态转移到该状态。跳过。那么如何判断当前的状态能转移到哪些状态呢,我们考虑遍历所有可能的汉堡,如果说当前的1111的子集中含有制作该汉堡的1的子集,并且,花费足够,就可以向后转移。最后我们遍历所有的状态,求出最大值。
甜点
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 20, S = 1 << 16;
int cost[N], val[N], pre[S], f[S];
void solve() {int n, tol;cin >> n >> tol;for (int i = 1; i <= n; i++) cin >> val[i];for (int i = 1; i <= n; i++) cin >> cost[i];for (int i = 1; i <= n; i++) {int q;cin >> q;pre[i] = 0;for (int j = 0; j < q; j++) {int x;cin >> x;pre[i] |= 1 << x - 1;//记录状态,所需的前置条件}}memset(f, -1, sizeof(f));f[0] = 0;int ans = 0;for (int i = 0; i < (1 << n); i++) {if (f[i] == -1) continue;//该状态不存在前驱,非法for (int j = 1; j <= n; j++) {if ((i & pre[j]) != pre[j]) continue;//含有所有的前置条件,子集便可if (i & (1 << j - 1)) continue;//已经制作就不能制作了int sum = 0;//计算费用for (int k = 1; k <= n; k++) {if (i & (1 << k - 1)) sum += cost[k];}if (cost[j] + sum > tol) continue;f[i | (1 << j - 1)] = max(f[i | (1 << j - 1)], f[i] + val[j]);}//向着更多的汉堡转移} for (int i = 0; i < (1 << n); i++) ans = max(ans, f[i]);//清点答案cout << ans << '\n';
}
int main() {ios::sync_with_stdio(false);cin.tie(0);int T = 1;cin >> T;while (T--) {solve();}return 0;
}
状态压缩DP一瞥【初识】相关推荐
- 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)
目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- BZOJ1688|二进制枚举子集| 状态压缩DP
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...
- hdu1074 状态压缩dp+记录方案
题意: 给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路: 状态压缩dp,记录方案数的地方 ...
- FZU-2218 Simple String Problem(状态压缩DP)
原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp
文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...
- 状态压缩DP AcWing算法提高课 (详解)
基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...
- hdu 5067(状态压缩dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...
- hdu 5418(状态压缩dp+Floyd)
点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...
最新文章
- 建议15: 使用dynamic来简化反射实现
- Websphere的类加载器以及策略的简单介绍
- 微软+开源,那些亲爱的以及热爱的
- php 字符符转整数
- 从HP收购ArcSight看SIEM/MSS市场现状与格局【9月17日更新】
- 关于 xib 的使用
- ...三个点es6用法
- 短视频解析技术原理,去水印原理分析整理汇总
- 页面开机自启动,页面置顶显示,页面持续获得焦点,鼠标点击器源码
- 找网络高手联系方式_怎么才能联系到网络高手(找网络大牛联系方式)
- 裁员潮,互联网寒冬的黑暗时刻
- Android shape属性大全
- 算法效率的度量--时间复杂度与空间复杂度
- 打开组策略 计算机配置,组策略命令,小编告诉你电脑组策略怎么打开
- AJAX IE7清除缓存
- matlab从无到有系列(六):高级图形处理功能(多窗口绘图以及花瓶绘制)
- xss.haozi挑战
- 一个网站的pv代表什么?
- 计算机设备选型的基本原则,设备选型的概念和选型依据
- 本周大新闻|谷歌眼镜企业版正式停售;Meta重组大裁员