背包dp
文章平均质量分 57
dp
野指针*
这个作者很懒,什么都没留下…
展开
-
2020沈阳ICPC H(背包+双指针) I(同余方程结论)
用dp解决这道题.我们以天数作为阶段,显然这是无后效性的,然后根据题意设计f[i]为处理前i次借车花费的最少的费用.然后这就是背包了.这里转移的时候我最开始是想到二分,但是会T.于是观察到转移有单调性,然后就用双指针优化dp了....原创 2022-08-11 23:50:49 · 334 阅读 · 0 评论 -
CF1716D(“按顺序“的完全背包)
题意:从坐标轴原点0出发,给定定值k,第一步走k的倍数,第二步走k+1的倍数....走的距离为正数.求对于[1, n]中的每一个坐标,有多少方案到达该坐标.思路:显然是个dp,假设为走到坐标i的方案数.考虑其转移方程.由这些坐标转移过来,但是我们不能直接写转移方程,因为这些坐标可能上一次走了k步,然后又从更新过来,这样会导致层次紊乱,算出的答案不对.其次,可能是同一个方案,可能会被计算多次.于是我们选择"分层"地设计转移方程,我们按照倍数从小到大转移方程,假设当前的倍数为k,1~k-1倍的方案数为,初始化当原创 2022-08-05 11:33:42 · 122 阅读 · 0 评论 -
AcWing 318. 划分大理石 (多重背包 + 可行性优化)
这道题显然是一个多重背包问题,用表示价值为的状态是否可达.for(int i = 1; i <= n; ++i) for(int j = 1; j <= c[i]; ++j) for(int k = m; k >= a[i]; --k) f[k] |= f[k - a[i]];但是,这样的时间复杂度过高.我们需要进行优化,当然,我们可以采用二进制或者单调队列的形式优化多重背包,降低时间复杂度.但是在这道题中,我们用另外一种方...原创 2022-03-15 11:43:11 · 440 阅读 · 0 评论 -
True Liars POJ1417(背包 + 并查集 + 路径回溯)
解题思路:1.首先这道题涉及关系问题,考虑使用并查集维护关系.对于a和b,若a说b是诚实人,那么a与b的身份必然相同,如果a是诚实人,那么b也是诚实人;如果a是骗子,那么b也是骗子.反过来,如果a说b是骗子,说明a与b的身份不同.这样我们可以用01边权的并查集维护这些人的关系了.最后我们可以获得一个并查集(森林)2.如果诚实人和骗子的数量一样多,显然我们是无法得知哪个是骗子,哪个是诚实人的.3.对于每棵树,我们可以枚举这棵树中一个人的身份,如果最后得到的合法的方案只有一种,那么有解,反之无...原创 2022-04-26 09:00:07 · 275 阅读 · 0 评论 -
Educational Codeforces Round 122 (Rated for Div. 2)D
预处理1操作到每个数的次数,我们发现a / x的值只能是a的约数的值,但是要得到a的约数未免也过于麻烦,所以我们直接暴力枚举a + (a / x)的值即可.接着就是0 / 1背包了.#include <bits/stdc++.h>#define LOCAL#define INF 0x3f3f3f3f#define IOS ios::sync_with_stdio(false), cin.tie(0)#define PLL pair<int, int>// #d..原创 2022-04-16 23:50:38 · 161 阅读 · 0 评论 -
树形dp(树形背包, 二次扫描和换根法)
树是特殊的无环连通图,有n个节点以及n - 1条边(可以是有向边也可以是无向边).树形dp则是基于树这个数据结构的动态规划问题.树分为有向树和无向树.有向树只要储存每个节点的子节点即可.而无向树则用邻接表的形式进行储存.注意无向树在遍历的时候遍历过的节点(状态)要打上标记,防止重复遍历.在树上设计dp算法时,一般以节点从深到浅(子树从小到大)的顺序作为dp的"阶段".dp的状态表示中,一般第一维是节点编号(表示以该节点为根的子树).我们有两种方式实现动态规划(对应两种遍历树的方式).分别是递原创 2022-04-01 18:15:54 · 668 阅读 · 0 评论