随笔分类 - 动态规划——背包dp/线性dp
摘要:题目链接:https://www.acwing.com/problem/content/description/6/ 通过单调队列优化多重背包,从第i-1阶段向第i阶段过渡,将所有可能的决策包含在单调队列中,队列中维护的是一个递减的决策集合,对应的函数值也是递减的,及时去除不可能是最优的解。 在O(
阅读全文
摘要:题目链接:http://poj.org/problem?id=1179 问题:给定一个环,其中边上是操作,有加和乘两种,点上是数值,执行的操作如下:找一条边断开,然后任选边开始将边相连的两个点进行运算后变成新的点,计算到最后变成一个点时这个点的最大值。由于合并两个区间的时候,如果操作数是加法的话容易
阅读全文
摘要:题目链接:http://poj.org/problem?id=1742 多重背包优化,给出若干面值硬币,和他们的数量,现在问1-m之间有多少数量是可以通过他们拼出的,复杂度需要控制,而且常数不能大。 解法非常巧妙,用g数组存上一个1离当前位置的距离,实际上这个问题是一个滑动窗口的问题,对于第i个面值
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/282/ 题目给出两个序列p,d 要求寻找一个方案,使得p-d的绝对值最小,在绝对值相同的情况下p+d的值尽量大,通过dp保存状态:前i个人中选择了j个,并且差为k时的p+d的最大值。转移
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/279/ 题目给定一个长度为n的序列g,和一个数m,要求将m分成n份,设定为数列a,使得数列g与数列a的乘积最小。根据排序不不等式,在g是升序的情况下,a是降序才会使得结果最小。所以对g进行降序排序之后,题意中的
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/278/ 题目给出一个n*m的矩阵,要求从中找出一个凸连通块,使得该连通块包含k个格子并且格子数之和最大,凸连通块由若干行构成,左右最多各有一个峰值。 可通过DP解决,每行处理完代表一个阶段,f[i,j,l,r,
阅读全文
摘要:题目要求:给一个n*m的矩阵,求从左上角到右下角的两条路径,使得两条路径上的值只和最大。从左上角往右下角走的时候只能向下或者向右。 在这个问题中阶段就是步数,步数与坐标点的横纵坐标之和相差一个常数,所以可以通过坐标只和以及两个点的横坐标来确定当前的状态集合。此时通过一个点的所有入边更新一个点即可。一
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/276/ 题目给出m个地点,n个任务,每两个地点之间有距离,有三个服务员,初始时刻服务员在1,2,3位置,每个服务必须且只有一个人到指定的地点,问完成这些服务的最小移动距离之和,决策集合是所有完成了i个任务并且另
阅读全文
摘要:题目链接:http://poj.org/problem?id=3666、 题目给出一个序列a,要求给出一个序列b使得两个数列每一项相减的绝对值之和最小,这里有一个重要的性质:存在一个满足条件的b,其中的数在a中都出现,可以通过数学归纳法去证明。 然后就是dp的转移,前i个数设定好,并且第i个数是第j
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/273/ 题目要求将N个人排成不超过五列,每列的人数限制而且递减,现在要求每行每列都是递减的方案的数量,通过状态集合以及转移规律,f[a][b][c][d][e]满足索引递减的性质 ,在转移的时候要维护这个性质,
阅读全文
摘要:dp: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; typedef unsigned long long ull; #define pf printf #def
阅读全文
摘要:题目链接:http://poj.org/problem?id=3280 一个序列,有n种不同的字符,可以在这个序列的任意位置插入和删除字符,花费不同,问最少需要多少花费可以使这个序列变成回文字符串。由于在头部插入和在尾部删除一个字符都能得到一个字符的前后回文对应,所以对于每一种字符只要知道插入和删除
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 题目中说明炮弹只能像更高的位置发射,对于发射高度X,<=X的高度这个炮弹是可以射到的,所以我们可以先考虑第一个高度,找出最长下降子序列,将其从原序列中删去,接着找下一个最长下降子序列,再将其从原序
阅读全文
摘要:最长公共子序列(LCS):两个串s1和s2中取出若干有序位置的字符,使得取出的两个字符串相同的长度的最大值就是LCS 最长递增子序列(LIS):S的子序列,其中各元素按索引严格单调递增 最长公共递增子序列(LCIS):上面两者的结合,参考博客:https://blog.csdn.net/wall_f
阅读全文
摘要:hdu2069 : 给出五种硬币,要求用这些面值的硬币构成S,问方案数是多少。经典dp问题。本题如果不限制金币的使用数量的话可以用dp[i]来记录总数为i的方案数,转移方程是dp[i]=dp[i]+dp[i-type[i]],也就是用type[i]硬币算在i中,方案数就是钱总数为i-type[i]的
阅读全文
摘要:题目链接:https://www.luogu.com.cn/problem/P1541 给定一个序列和一个操作序列,操作序列中只有1234四个数字,表示可以前进的步数,初始在1处,操作最后一定会全部用完,在此我们可以用dp描述四种状态:四种操作的使用次数,通过次数我们也可以得到目前的位置。 代码如下
阅读全文
摘要:题目链接:https://www.luogu.com.cn/problem/P1417 这个题目不是单纯的01背包问题,因为01背包给出的物品的价值是不变的,但是这个题目中物品的价值会随着时间的增长而降低,所以要确定什么优先顺序取(x,y)才会得到更有的结果,所以就涉及到了排序和贪心。还有一点与01
阅读全文
摘要:题目链接:https://www.luogu.com.cn/problem/P1064 就是一个01背包的变种问题,只是选择的可能情况不同。对于01背包,对第i个物品,选择的情况有两种:选择或者不选择,而本问题中选择的情况有五种:对于一个主件来说,可以不选择,可以只选择主件,可以选择主件+第一个附件
阅读全文
摘要:由于数组的滚动过程中当前值(i,j)的更新需要用到上一层的(i-1,j-wi)的值,所以在更新当前的j之前不能更新上一层的j之前的值,故01背包是从后向前更新的(重量取值是从大到小的)。 代码如下: 1 #include<bits/stdc++.h> 2 using namespace std; 3
阅读全文