DP Rush

这个东西怎么 Rush 啊。。

斜率 DP

如果有 \(a_ib_j\) 这样的东西,就用斜率 DP。

也就是求截距最值,比如 P2120 [ZJOI2007]仓库建设 中有如下 DP:

\[f_i=f_j+x_i(s_i-s_j)-(t_i-t_j)+c_i \]

\(y=kx+b\) 化作 \(b=y-kx\),那么有

\[[f_i-x_is_i+t_i-c_i]=[f_j+t_j]-[x_i][s_j] \]

那么就是有若干 \((x,y)\to (s_j,f_j)\) 的点,要用直线去切它,求截距最小。

由于我们的斜率 \(x_i\) 是单调上升的,于是维护一个下凸包即可。

弹出:不断弹出队头,直到下凸包的最前一条线 斜率 大于 现在切它的 \(k\) 即可。画一下图就知道了,实在不行就比较队头和次队头的 dp 值。

如果斜率不是单调上升的,用「平衡树」护送凸包。

普通 DP

P4229 - 某位歌姬的故事

https://www.luogu.com.cn/problem/P4229

先离散化,那么一个区间就变成了一个位置。设 \(f_{i,j}\) 为处理前 \(i\) 个位置,上一个定格的区间为 \(j\) 的方案数。

参考题解转移。

P3592 - [POI2015] MYJ

https://www.luogu.com.cn/problem/P3592

区间 dp,设 \(f_{l,r,k}\) 为区间 \([l,r]\) 的最小值为 \(k\) 时的答案。

然后为了方便,做一个 \(k\) 的前缀和,即 \(f_{l,r,k}=\max(f_{l,r,k},f_{l,r,k+1})\)

那么 \(f_{l,r,k}=\max(f_{l,i-1,k}+f_{i+1,r,k}+val)\)\(val\)\(i\) 取到 \(k\) 时的贡献。

CF53E - Dead Ends

https://www.luogu.com.cn/problem/CF53E

\(f_{S,T}\) 为点集为 \(S\),叶子集为 \(T\)。注意有统计重复的情况,打表得 \(f_{S,T}/=popcount(T)\) 即可。

期望 DP

求记住这个式子:

\[E=\sum\limits_{i=0}^n i\times P[x=i]=\sum\limits_{i=0}^nP[x\ge i] \]

呜呜。

posted @ 2022-04-08 18:43  BlankAo  阅读(60)  评论(0编辑  收藏  举报