基础 Dp
1.线性 dp
1.1 P1412 经营与开发
由于前面的操作只会对后面乘一个系数。
所以这题需要倒着 dp。
\(f(i) = \max (f(i+1)\cdot k+v,f(i+1))\)
\(k,v\) 分别为损耗,利益。
2.区间 dp
状态通常为一个区间。
2.1 P1880 [NOI1995] 石子合并
对于区间 \([i,j]\) ,枚举断点 \(k\),并用 \([i,k],[k,j]\) 更新。
注意这题要断环成链。
2.2 P1220 关路灯
我们发现已经关了的路灯一定是一个连续的区间。
\(f(i,j,0/1)\) 表示已经关了 \(i\sim j\) 的灯,处于左边或右边。
转移迎刃而解。
3.树形 dp
3.1 P1352 没有上司的舞会
\(f(u,0/1)\) 表示 \(u\) 选/不选,其子树最大权。
\(f(u,0)=\sum\max(f(v,0),f(v,1))\)
\(f(u,1)=\sum f(v,0)\)
其中 \(v\) 为 \(u\) 儿子。
3.2 P2014 [CTSC1997] 选课
\(f(u,k)\) 表示 \(u\) 子树选了 \(k\) 门课。
左右子树像背包那样合并。
3.3 P3478 [POI2008] STA-Station
换根 dp,就是把父节点的信息转移到儿子上。
\(f(v)=f(u)-siz(v)\cdot dis(u,v)+(n-siz(v))\cdot dis(u,v)\).
4.状压 dp
考虑把状态压缩成整数。
4.1 P1896 [SCOI2005] 互不侵犯
设 \(f(i,S)\) 为前 \(i\) 行,第 \(i\) 行是 \(S\) 为状态的方案数。
\(f(i,S)=\sum f(i-1,T)\),\(S\) 与 \(T\) 互不侵犯。
5.数位 dp
一般采用记忆化搜索。
5.1 P2657 [SCOI2009] windy 数
考虑设计状态 \(f(p,last,zero,limit)\),
表示还有 \(p\) 为要填,上一位是 \(last\),\(zero\) 为是否全为前导零,\(limit\) 表示是否有最高位限制。
记忆化搜索。
答案是 \(R\) 的答案减去 \(L-1\) 的答案。