动态规划学习笔记

匹配型 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\),该区间的最大收益.则

\[f_{l, r, v} = \max_{l \le k \le r} \left( \max_{v' \ge v} f_{l, k - 1, v'} + \max_{v' \ge v} f_{k + 1, r, v'} + cv \right) \]

其中,\(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

tmp

\(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\) 就不太好了,所以考虑换出来.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值