[DP优化题单]论如何更优雅地转移
整个人都要变成 DP 了= =.
一、篮球
有 \(n\) 种物品,第 \(i\) 种物品有 \(c_i\) 个,初始代价是 \(a_i\),被选一次代价就会减少 \(b_i\)(第 \(k\) 次选的代价就是 \(a_i-(k-1)b_i\)),你想知道对于 \(k=1…m\),总共选 \(k\) 件物品出来代价的最小值是多少。保证 \(a_i-(c_i-1)b_i>0\).
\(n<=1000,m<=10000\).
分析题目特性,一定是将某个物品选完才选择下一个。
再往下挖掘一下,我们选择的物品中,至多只有一个没有被选完,其他的要么不选要么选完。
那么我们就有一个暴力,枚举这个没被选完的是谁,然后前缀后缀分别做背包,算出恰好选 \(k\) 次的最小代价,再和这个物品合并。复杂度 \(\mathcal O(nm^2)\),因为我们要枚举这个没被选完的物品,对于每个物品做一次 \(\mathcal O(nm)\) 的背包。
分治优化先咕。
二、序列
有 \(n\) 种物品,第 \(i\) 种物品第一次选择的收益是 \(a_i\),之后每次选择的收益都是 \(b_i\),代价始终为 \(c_i\). 你需要求出在总代价不超过 \(m\) 下收益的最大值。
有 \(Q\) 次修改,第 \(j\) 次修改会在第 \(i\) 次修改 \((i<j)\) 的基础上修改一个物品的两类收益。你需要对于每次修改后输出答案。
\(n,m,Q<=2000\).
如果没有修改,那么我们可以考虑这样做 \(\tt DP\):
当我们算完 \(f_{i-1,j}\) 后,我们先强制选一个当前的 \(i\),单独的这一次收益是 \(a_i\),转移到 \(f_{i,j+c_i}\),然后,再做状转:
最后再来 \(f_{i,j}=\max\{f_{i,j},f_{i-1,j}\}\) 表示 \(i\) 不选。
由于修改是一个类似于树状的结构,每次修改都会让某个物品在某段区间的价值是相同的,于是我们可以使用线段树分治,每次分治的时候都只有加入一个物品的操作。
此处有坑