随笔分类 - ACM / 动态规划 背包dp
摘要:原题链接 错误思路: 枚举每一个人,优先队列贪心求最小的不重合区间组数. 思路: 实际上贪心不一定能贪到正解,这里类似背包需要枚举所有可能.背包体积是时间: $$f[i] = f[i-1],f[node[pos].l]+w $$ 需要按区间右端点排序. ##Code #include <iostre
阅读全文
摘要:原题链接 考察:二分+完全背包 错误思路: 说实话一眼看就觉得像背包,但是1e7的空间真的有点离谱,实际证明就是要敢想.后面想的贪心都贪不到最优解,枚举会超时. 思路: $f[i][j]$表示前$i$件物品,价值最少是j的最小花费. \(f[i][j] = min(f[i-1][j],f[i][j-
阅读全文
摘要:原题链接 考察:背包dp yxc:没做出来本题的反思自己有没有认真听基础课 我:菜狗不配() 思路: dfs写的,当时觉得铁TLE,但是没有想到别的做法(.) f[i][j]表示前i个物品重量为j是否能实现. dp方程: f[i][j] = f[i-1][j] f[i][j] = f[i-1][j+
阅读全文
摘要:原题链接 考察:01分数规划+01背包 错误思路: 二分求最大值,check函数里对 t[i] - mid*w[i]排序,从大到小选,只要和为sum就一直选,最后检测选择的W是否>=m 这个思路错在不能从大到小选,因为存在t[i] - mid*w[i]很小,但是w[i]很大使原本从大到小的W>=m
阅读全文
摘要:原题链接 考察:背包dp 思路: 组合问题一般用背包dp解决.f[i][j][k]表示前i个数选j个数,余数为k的最大和. 很容易想到状态转移方程f[i][j][k] = f[i-1][j-1][Get_Mod(k-a[i],K)]+a[i],f[i-1][j][k]之间取最值.时间复杂度是105*
阅读全文
摘要:原题链接 考察:线性dp+背包dp 思路: 每个横坐标可以选择按或者不按,这种组合问题求最优解可以考虑背包dp. 易知f[i][j]为以i为横坐标,j为纵坐标的最小按键次数.这道题不需要不通过后判两次dp.只需要在当前坐标存在管道后检测是否通过管道,如果不通过就是输出0 当前管道数-1.那么dp转移
阅读全文
摘要:原题链接 考察:背包dp 思路: 做之前看成01背包,然后答案一直不对,醉了. 实际是完全背包,因为需要的东西不超过5类,且不超过5个,所以可以用5维数组.5类物品的数目都是体积. 需要将编号离散化,这里用的是map映射. 但是注意的是我的本地IDE 在mp[x] = mp.size()是从1开始,
阅读全文
摘要:原题链接 考察:多重背包dp 思路: 多重背包板子,然后注意压掉一重循环需要倒序体积.... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 typedef long lo
阅读全文
摘要:原题链接 考察:背包dp 思路: luogu题解的300分界线的题解本蒟蒻完全看不懂 .这篇题解是自己对第一篇题解的理解. 首项观察数据范围可以发现此范围MLE,需要压缩范围.根据极差<=3.可以将体积范围压成1~4. 但是!这道题不能把m根据vi压缩体积,根据vi的压缩不同,会导致m得到不同的取值
阅读全文
摘要:原题链接 考察:分组背包dp 错误思路: 设置f[i][j]前i组选j个的集合,但这样划分集合没有考虑钱数,求不到最优解.pass 设置f[i][j][k]表示前i组选j个体积为k的三维数组,先不说有MLE的风险,而且枚举几个的时候很难计算体积 正确思路: 由上面应该要联想到状压dp,在能枚举出几个
阅读全文
摘要:原题链接 考察:二维费用背包 思路: 套01背包模板,但是数组范围不要开错,注意N,M,K的位置,记录此题纯粹提醒我自己..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std
阅读全文
摘要:原题链接 考察:01背包dp 错误思路: 定义二维结构体结构体DP[i][j],代表前i个人选j个的值.DP[i][j].cost代表最小花费,DP[i][j].sum代表最大和.由第i个人选不选划分集合. 此思路错在这里的最优子结构不一定推得到最优解. 比如数据: 5 3 1 1 2 3 4 4
阅读全文
摘要:原题链接 考察:IDA* or 状压+背包dp 思路一: n个物品包,每个都可以用二进制表示,f[i][j]表示前i个物品组成j状态最少需要多少包,状态转移方程为 int t = min(f[i-1][j|candy[i]],f[i-1][j]+1); f[i][j|candy[i]] = min(
阅读全文
摘要:原题链接 考察:背包dp 错误思路: f[i,j] j表示和 此思路必错,会MLE. 正确思路: 需要转换式子.已知 x + x+d1 + x+d1 +d2+x+d1+d2+d3...=s 等价于 nx+(n-1)d1+(n-2)d2+.. = s. s与n已知,d在a与b徘徊,而x的范围太广,因此
阅读全文
摘要:原题链接 考察:多重背包dp 坑爹题目,敲半天代码发现题目意思都弄错了 这道题的ai 不是i木块的高度和不准超过ai 而是i木块在整个电梯的高度不允许超过ai 我还奇怪为什么题解都没累加答案.... 这道题本蒟蒻不会用二进制优化..如果用了不知道怎么处理它属于哪个物品. 思路: 显而易见需要将木块按
阅读全文
摘要:原题链接 考察:多重背包dp 实际上是考察多重部分和的问题. 在本题如果直接用二进制优化时间复杂度是108 会TLE.因此必须优化 多重背包问题中f[j] = 1是因为上一轮f[j] = 1或者本轮f[j-v] = 1.如果f[j]在枚举第i-1种硬币时就已经为1,那么f[j]在第i轮就没必要在赋值
阅读全文
摘要:原题链接 考察:完全背包dp+线性代数 思路: 这道题其实是求给定a数组的极大无关向量组. 这里要能分析出一些性质: 如果(a,n)能被(b,m)所替代,那么a数组能被b数组表示 b数组中gcd>1的一对数,大的没必要存在 b数组是a数组的一部分元素. 假设b数组能表示a数组,且存在一个数x属于b数
阅读全文
摘要:原题链接 考察:完全背包dp 思路: 写这道题需要有前置知识: 已知互质的数a与b,最大的不能由它们表示的数是(a-1)*(b-1)-1. 现在新加入数字c,不能表示的范围应该变小,因为>(a-1)*(b-1)-1的数都能被表示. 现在给出n个正整数,那么最大的不能由它们表示的数<10000. 确定
阅读全文
摘要:原题链接 考察:完全背包dp 或者 打表 思路: 1.如果知道公式的话,三行代码就可以解决,答案是(n-1)*(m-1)-1.前提条件是n与m互质. 2.如果不知道,可以用暴力dfs打表.先固定一个数n,再看m变化时答案如何变化.eg:当n==3,ans在m情况下每次比m-1多2.最后说不定能推出公
阅读全文
摘要:原题链接 考察:完全背包dp 人傻了,本来还想先用二维,结果没写出来,一脸懵逼看了题解.题解全是一维,最后发现是我f[i][j] = min(f[i-1][j],f[i][j-i*i]+1)的第二个i写成了i-1,板子背错了= = 这道题的物品体积是i*i,价值是1.这样才能算出个数来 1 #inc
阅读全文