连续段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\) 和精细刻画转移范围比较重要,有些细节。

posted @ 2026-10-23 20:41  wzc6666  阅读(7)  评论(0)    收藏  举报