DP题记录
像我这种低批废物,不得不记录一些套路了。
寒假集训 dp 题记录。
P7962 [NOIP2021] 方差
首先观察性质,得到差分可以交换,并且最优情况下是单谷的。
剩下的就比较简单了。把式子化一下,拆成一个差,然后把后项设为状态最大化前项即可。
P8392 [BalticOI 2022] Uplifting Excursion (Day1)
厉害题。首先注意到容量大但是单价小,所以考虑直接贪心,然后反悔。
具体地,把贪心后的重量限制在 \((L-m,L]\) 中,如果不在就贪心地拿出最大/最小。
然后就是 dp,不断拿出、放回元素,慢慢逼近 \(L\)。这个过程中背包重量一定可以限制在 \((L-m,L+m)\) 内。
然后观察可得,调整过程中背包重量不会出现两次。因为如果出现两次,它肯定是拿出来若干,再塞回去更少数目,必定不优(前面的贪心保证了不会出现以少换多的情况)。
于是最多也就会操作 \(2m\) 个物品,dp 的背包容量就只有 \([-2m^2,2m^2]\) 了。(好像只有 \([-m^2,m^2]\)?)
P7519 [省选联考 2021 A/B 卷] 滚榜
典型的省题题。首先只需找到 \(b_i\) 的差分,转移时就直接使差分尽可能小,因为题目只求排列方案,与 \(b_i\) 的分配无关。
暴力的想法是枚举差分。但这样甚至是错误的,因为一个排列会被算多次。
AT_abc221_h [ABC221H] Count Multiset
挺神奇的题。
首先容易想到把多重集排个序,然后看成一张柱状图。
然后最直接的想法是,定义 \(f_{S,i,x}\) 表示目前总和为 \(S\),摆放了 \(i\) 个数,此时摆放的数为 \(x\) 的方案数。转移:
这个东西时间复杂度不能接受,为 \(\mathcal{O}(n^3)\)。我们想要优化它,但是貌似难以下手——转移的时候不能用类似前缀和的优化,因为 \(S\) 的变化是间隔 \(x\) 的,并且 \(x\) 这一维显得很浪费。
于是考虑枚举 \(x\),每次只塞一个 \(x\)。。。但是还是难以满足题目的需求,并且无法限制 \(m\) 个相同的数。
这时候,我们考虑从上往下推!
设 \(f_{S,x}\) 表示总和为 \(S\),当前层宽度为 \(x\) 的方案数。
转移:
啊?怎么突然变得这么简单?太神奇了吧。
前缀和优化即可。
(后记:其实在写题解的时候一直在想,要怎么想到这个思路。。。但发现它就是凭空出现的,一个很牛的思路。。。是因为没见过这个套路吗?这谁见过啊。看来这就是所谓的思维题吧。)
AT_agc013_d [AGC013D] Piling Up
考虑画出白球随取的次数变化的图像,容易发现它要么向上,要么不变,要么向下。
如果设 \(f_{i,j}\) 表示取了 \(i\) 个,目前有 \(j\) 个白球,但是这可能会算重(因为拿出球的序列是相同的)。
所以就很套路地强制必须出现 \(0\) 个白球的情况。这样不仅能不重不漏,还可以不让白球取到负。所以就加一维 \(0/1\) 表示是否有过没有白球的情况。
AT_agc002_f [AGC002F] Leftmost Ball
首先,不妨把第一个出现某个颜色的球涂成白色。
然后你要让每个白球唯一对应一个颜色,否则会算重。
因此从最左侧开始,如果遇到一个白球,那么钦定往右第一个遇到的没有被选过的颜色就是它原本的颜色。
于是这就很像一个拓扑序的问题,必须先选前一个白球才能选这个白球,而必须先选前一个颜色的彩球才能选这个颜色的。
到这里,如果你反应比较快,会发现它其实就把问题简化成了 \(k=2\) 的情况,因为剩下的 \(k-2\) 个可以在放完前两个球之后随便放,而且剩余的空位的个数不受影响。
然后考虑 dp,既然这两个相互独立,那就都设为状态好了。设 \(f_{i,j}\) 表示放了 \(i\) 个白球,放了 \(j\) 个颜色的剩余 \(k-1\) 个彩球。
如果选择放白球,那么选择唯一。因为肯定要放第一个没有被占的位置。
如果选择放剩余 \(k-1\) 个彩球,那么第一个彩球肯定放第一个,而后面是没有限制的,没有被占的位置都可以放上,就可以直接组合数。
转移方程的话去看其他题解吧。我认为这个自己很容易写出来。

浙公网安备 33010602011771号