匹配型 dp
P8321
这个题的第一步转化太巧妙了.将 \(a\) 和 \(b\) 按照从大到小的顺序合并为长度为 \(2n\) 的数组 \(c\),如果一个元素来自 \(a\) 染红色,否则染蓝色.
问题变成:给定一个长度为 \(2n\) 的数组,有 \(n\) 个红色和 \(n\) 个蓝色,我们可以将一个红色和一个蓝色配对,完成全部 \(n\) 次配对的方案共有 \(n!\) 种,问 \(n!\) 种方案的权值和.好精彩的转化.
具体转移不细写了,上个代码吧.
区间 dp
P3592
先锁定 \([1, n]\) 中最小值 \(v\) 的位置,假设是 \(k\).那么,对于消费者 \(i\),只要 \(k \in [a_i, b_i]\).那么它一定要么会选择在 \(k\) 位置洗车(当 \(c_i \ge v\)),要么不洗(\(c_i < v\)).
将这些消费者抛去,剩下的消费者消费者 \([a_i, b_i]\) 一定要么在 \([1, k - 1]\) 内部,要么在 \([k + 1, n]\) 内部,这形成了子问题,启发我们进行区间 dp.需要注意的是 \(k\) 的条件:\([1, k - 1]\) 和 \([k + 1, n]\) 的最小值一定大于等于 \(k\) 处的值 \(v\).
设 \(f_{l, r, v}\) 为考虑 \([l, r]\) 内的所有消费者,如果这个区间的最小值为 \(v\),该区间的最大收益.则
其中,\(c\) 为 \(m\) 个消费者中,满足 \(l \le a_i \le k \le b_i \le r\) 且 \(c_i \ge v\) 的个数.
最后,不难看出最优情况下,所有的 \(v\) 一定是出现过的 \(c_i\)(否则一定可以调整),所以 \(v\) 一共只有 \(m\) 种,在状态设计的维度中可以直接离散化为 \(1 \sim m\)(当然,在值 \(cv\) 中需要保留).
dp 优化 - 推式子技巧
P1070

\(f\) 的长度是 \(m\),\(s\) 的大小 \(n \times m\),\(a\) 的大小为 \(n\).\(s\) 的第一维下标范围 \(0 \sim n - 1\),是 \(\mod n\) 意义下的.目标:将原先 \(\Theta(nm^2)\) 的 dp 优化为 \(\Theta(nm)\).
- 第一步换元 \(y = x - j\) 的动机:\(s[x + i - j][i]\) 中同时出现了 \(x\),\(i\),\(j\) 三个变元,不好.换 \(y = x- j\) 后,最里侧的 \(\max\) 能神奇地做到分成两个部分:一部分 \(s[y + i][i]\) 与 \(j\) 无关,另一部分与 \(i\) 无关.换元可以有效减少变量个数.
- 然后使用了一个套路:交换 \(\max\).同种 \(\max\) 和同种 \(\min\) 都是可以交换的,即二元函数的最大值或者最小值,求最大值或者最小值的顺序不重要.只有当求鞍点(即一个变元的目标是最大值,另一变元的目标是取最小值)时不可以交换顺序.
- 这里交换 \(\max\) 的意义是什么?答案是把 \(s[y + i][i]\) 提出来,让最里层的 \(\max\) 与 \(i\) 无关.从而,我们可以用滑动窗口维护,因为滑动窗口必须支持所维护的内容与窗口端点无关,因此这里把 \(i\) 从最里层的 \(\max\) 提出动机是如此的.
- 或者也可以说,最里层的 \(\max\) 已经同时包含了 \(j\) 和 \(y\),此时再包含一个 \(i\) 就不太好了,所以考虑换出来.
1396

被折叠的 条评论
为什么被折叠?



