一些DP相关 
换根DP 
- 计数DP:直接容斥法
- 最值DP:维护最大次大值法,前后缀合并法
树上连通块DP 
- 法一:直接DP,在过程中钦定当前点为最浅点
- 法二:基于DP插入复杂度小于合并复杂度,类似shopping的做法
- 例题:shopping
划分型DP 
- 处理问题:将一个序列分成两个子序列(染两种颜色),然后要满足某些限制
- DP式通常形如: 
- 注意:应熟知此类DP是很好优化的
例题 
- CF1849F
- P11233
- CF1647F
的处理 
- 首先: 应该有不严格单调性
- 然后常见的,有两种处理办法: - 双指针:钦定左边大于右边,然后答案必然只从两分界点中取
- 二分: - 根据左边和右边的大小做二分
- 当左右相等时必然最优(剪枝)
- 可以用不常用写法
 
 
例题 
太多了,懒得找
处理DP的二维价值 
基本处理办法 
把一维价值也设入状态中,转换成背包问题
常见剪枝 
只存下有值的状态,在转移完做一下单调性剪枝
- 相关研究: - 其不能直接降低复杂度(基本量级不变)
- 但是,转移次数越多,转移越复杂,可以除以的常数越大
- 其算法瓶颈通常在枚举状态进行转移,以及后续的剪枝(考虑算法时间时主要考虑这一点)
 
特别的优化办法 
- 分析DP性质,去掉一维价值
- 直接贪心,考虑怎么选
- 换做法
例题 
- AGC035D
例题 
P9051:
- 首先二分转判定
- 朴素的DP有两维价值,但注意到DP的第一维价值后面都不会用到
- 那么,我们可以直接在求出第一维价值时就判定是否大于
- 这样只用保留一维价值
值域定义域互换 
适用范围 
最优化DP状态的优化,DP值有单调性
注意点 
- 在互换后,一般状态都不能设“恰好”
- 保证得到的DP值是当前答案等于或劣于状态中的答案
例题 
LIS 
- 可以直接设 表示LIS长度为 的最小的结尾值, 初始为
- 然后每次扫进新数 ,就在 数组里找到 的第一个位置, 即可
- 可以发现,某种程度上这避免了离散化
- practice: [ABC360G] Suitable Edit for LIS
ABC364E Maximum Glutton 
- 观察到 很小,但是对于搜索剪枝来说又不够小(一般应该是30 - 40, 40 - 50可能是折半)
- 直接做,显然是二维的背包,但是状态太大了,显得很冗余
- 因为此题是经典DP题(显然不能贪心),所以仍考虑优化DP
- 观察到值域其实只有 的,而且有单调性,所以值域定义域互换即可
1D/1D 
自己规定了在线转移和非在线转移两个概念
简化DP转移 
给DP分层,或给DP的转移分类,从而转化成1D/1D问题
决策单调性 
适用场景 
没有其他思路,只有一个DP,而且没法用其他优化
验证方法 
暴力跑随机数据看决策点是否单调
实现方法 
- 决策栈 + 二分:处理在线转移
- 分治:处理非在线转移
PS 
- 有的斜率优化可能表现出了决策单调性
- 有的决策单调性是因为有凸性,此时也可以用下述的优化
凸性相关 
前置知识 
如何发现DP的凸性 
- 满足四边形不等式的序列划分问题的答案(一定是)
- 转移每次加上一个凸函数(较有可能是)
- 直观理解很凸(较可能是)
- 费用流建模(一定是)
- 其他验证方法:暴力跑随机数据验证
常见算法 
闵可夫斯基和 
- 转移是 卷积
- 具体而言,要求DP是非在线转移
- 经典的,其可以优化背包合并
wqs二分 
- 答案求“恰 个”
- 可以直接去掉表示选多少个的那一维(背包DP)
slope trick 
- 核心:利用凸性动态维护DP数组
- 处理过程: - 将DP数组转换成单调的,方便维护(差分数组单调且均非负)
- 使用DS维护对DP数组的操作,通常维护的是差分数组和其首项(或某一项)
 
一些要分析DP数组形态的题 
Sonya and Problem Wihtout a Legend 
solution1:
- 有暴力DP,没什么贪心的思路,可以继续优化DP
- DP形如凸函数加起来,猜一个凸
- 确实,所以维护一下差分,注意修改时保证始终
- 最后要维护一个实际DP值才能用差分推出答案,随便取一个即可
solution2:
- 序列递增,直接差分,发现就是要让差分数组全变成
- 操作每次会将差分的一个数 ,下一个数 --,或是相反
- 很流,可以费用流,竟然过了
P9051 
- 经典凸性转移形式:网格图两种走法求最短路
- 处理: - 考虑直接维护差分数组及首项
- 首项是好处理的
- 差分数组每次直接插入一个数就可以了
- 剩下的一些细节就特殊处理
 
 szzjz WiKi
szzjz WiKi