连续段DP学习笔记
P5999 [CEOI 2016] kangaroo
首先转换问题,跳到的位置序列其实是个排列,对于这个排列,首位要是 \(s\),末位要是 \(t\)。
中间的位置有 \(p_{i - 1} < p_i > p_{i + 1}\) 或 \(p_{i - 1} > p_i < p_{i + 1}\)。
这个限制和下标有关,还和值域有关,我们肯定得扫描线扫一维,扫值域。
发现没扫完的时候填入的数会成为若干个连续段,为什么对于连续段考虑呢?因为相邻位置有限制。
发现新填进来的数一定为最大值,所以有两种方式第一种是新开一段第二种是合并两段,不可能挂在一边,这样这个数会有一边露出来,一边比他小一边比他大肯定不行。
具体刻画,设 \(dp_{i,j}\) 为前 \(i\) 个数形成 \(j\) 段的方案数,转移式如下:
\(dp_{i , j} += dp_{i - 1 , j + 1} \times (j - [i > s] - [i > t])\)
\(dp_{i , j} += dp_{i - 1,j - 1} \times j\)
对于 \(s\) 和 \(t\) 转移也是简单的,不同的是我们可以选择接在首段前和尾段后。
\(dp_{i , j} = dp_{i - 1,j - 1} + dp_{i - 1,j}\)
于是做完了。
P2612 [ZJOI2012] 波浪
发现输出 \(30\) 位用 __float128,甚至还要数据点分治,接下来说的都抛开这些,因为不重要。
相邻位贡献,和值域有关,又是二维限制,扫值域。
怎么计算贡献呢?有些困难,但是发现这个可以拆,假设前 \(i\) 个数形成 \(j\) 个连续段,那么后面的贡献都要加上 \(2 \times j\)。
为什么呢?这个和拆 MEX 有点像,对于一个 \(a\) ,相邻的 \(p_i < a,p_{i + 1} \ge a\),我们就称这一位产生了贡献,\(p_i\) 更大的情况也一样。
题解中也给出了图形化的理解,二维限制就在平面上画出来,两个相邻点连线,线的竖直落差就是差值。
连续段这边空着,相当于一个“插头”,即使这一位补上,把两个区间合并,插头也要产生贡献。
但是我们忽略了一件事,就是如果区间贴边,“插头”则不会生效,设有 \(c\) 个贴边情况,显然 \(c \in [0 , 2]\)。
那么,新加入一位答案固定增加 \(2 \times j - c\)。
开始刻画dp状态,设 \(dp_{i , j , k , c}\) 为考虑前 \(i\) 个数,形成 \(j\) 个连续段,总贡献为 \(k\),贴边个数为 \(c\) 的概率。
转移就有点复杂了。
设 $dk = k + 2 \times j - c $。
- 在边上单开一段:\(dp_{i , j + 1 , dk , c + 1} += dp_{i , j , k , c} \times \frac{2 - c}{i}\)。
- 在非边上单开一段:\(dp_{i , j + 1 , dk , c} += dp_{i , j , k , c} \times \frac{j + 1 - c}{i}\)。
- 延伸到边上:\(dp_{i , j , dk , c + 1} += dp_{i , j , k , c} \times \frac{2 - c}{i}\)。
- 延伸到非边上:\(dp_{i , j , dk , c} += dp_{i , j , k , c} \times \frac{2 \times j - c}{i}\)。
- 合并两个连续段:\(dp_{i , j - 1 , dk , c} += dp_{i , j , k , c} \times \frac{j - 1}{i}\)。
这五个的边界正常判就ok了,不是难点,注意要让数组别越界我因为这个输出 \(0\)。
P7967 [COCI 2021/2022 #2] Magneti
水题切了。
发现两个磁铁互相之间是否吸引,只取决于磁力大的那个,而且,只要相邻的吸不上,不相邻的就更吸不上了。
经典的连续段dp模型定式启动,扫值域,记录段数。
发现一个事,就是可以空很多,未必两个磁铁放得尽可能近,这个乘组合数。
具体地,设 \(dp_{i,j,k}\) 表示前 \(i\) 个磁铁成 \(j\) 段占用长度为 \(k\) 的方案数。
转移如下:
- 单开一段:\(dp_{i , j , k} += dp_{i - 1 , j - 1 , k - 1} \times j\)。
- 延伸一段:\(dp_{i , j , k} += dp_{i - 1 , j , k - a[i]} \times j \times 2\)。
- 合并两段:\(dp_{i , j , k} += dp_{i - 1 , j + 1 , k - 2 \times a[i] + 1} \times j\)。
最后答案为 \(\Sigma dp_{n , 1 , i} \times C_{l - i + n} ^ n\)。
闲话:这是我的第 \(100\) 个洛谷紫题,还是我自己切的。
P9197 [JOI Open 2016] 摩天大楼 / Skyscraper
?!原原!?
同P2612只不过没它恶心,求的是方案数不用数据点分治不用卡精度不用快写。
特判 \(1\) 和精细刻画转移范围比较重要,有些细节。

浙公网安备 33010602011771号