dp of dp
EternalAlexander · · 个人记录
最近有一些学到的东西,想写几个这种专题随笔记录一下,也可以给有兴趣的选手做一个参考。
大概是会放某一种套路的几个例题吧。
反正就是打算先写一个试试。至于今天为什么选 dp of dp 这个主题,因为这三道题都是我独立做出来的,写这个可能体会深一点,也会比较有成就感?
个人水平有限,涉及内容大概只有普及组难度,并且难免有一些错误吧,可以选择性观看。
一
顾名思义,dp of dp 是一种在 dp 状态里记录另一个 dp (也不一定是 dp,可能是贪心算法)的状态,从而进行计数的方式。
可能这么说不是很清楚,我们先看一道例题:
对于一个数,你可以进行任意次操作,每次操作可以删去数字相同的连续一段,例如你可以把
记把
(这个题时间久远,而且不在任何我已知的 oj 上,并且题面是凭记忆写的,不一定完全准确)
第一眼并不知道怎么入手。首先想一想,怎么求这个
一个显然的做法是从大到小(其实任意顺序都是对的)处理每种数字,将这种数字的连续段删掉。比如
我们简化一下这个过程,维护一个单调栈,从左往右扫,把遇到的数字入栈时,将栈中大于自己的数都弹掉,并且使
然后怎么计数呢?
后来讲题的老师说,这玩意有一个好听的名字,较做 dp of dp。
二
写这个的直接原因是随机跳题跳到了 p1758 。
upd:经 srf 神犇指教,这个题有更容易的理解方式。
首先
这里的 操作序列 是一个长为
首先考虑对于一个操作序列,如何统计有多少种操作序列能得到和它一样的结果。
先把按照这个操作序列操作得到的串写出来,然后是一个普及组dp:
然后,我们要计算所有操作序列的答案之和。发现了吗,这就是个 dp of dp!