动态规划杂题选记
1.P3092 [USACO13NOV]No Change G
简单状压,\(f[S]\) 表示当前状态为 \(S\) 能够购买的最远商品编号。
转移时二分当前的硬币最远能够买到哪里。
当 \(f[S]=n\) 时统计答案。
2.P3126 [USACO15OPEN]Palindromic Paths G
数字三角形模型,可以记 \(f[k][i][j]\) 表示总步数为 \(k\),左上角的人横坐标为 \(i\),右下角为 \(n-j\) 的路径数量。
转移就从两个人的两种方向转移就好。
发现 \(k\) 只从 \(k-1\) 转移,可以滚掉。
是回文串当且仅当两者重合,即 \(f[i][i]\)。加强版记得判断 \(n+m\) 的奇偶性。
3.P1437 [HNOI2004]敲砖块
转移是从上一层的后一块砖来的,所以我们考虑倒序枚举转移。
设 \(f[i][j][k]\) 表示当前敲到了第 \(i\) 列第 \(j\) 行,共敲了 \(k\) 块砖的最大收益。
那么转移有:
\[f[i][j][k]=\max_{l\in[j-1,n-i]}(f[i+1][l][k-j]+\sum_{p=1}^ja[p][i])
\]
因为当前列 \([1,j]\) 的砖都要敲完,可以维护一个前缀和 \(O(1)\) 做。
同时保证上一列至少敲到 \(j-1\),这列可以敲 \(j\) 就可以了。
4.P6564 [POI2007] 堆积木KLO
比较巧妙的状态设计及优化。
直接给出:\(f[i]\) 表示强制让 \(i\) 归位的最大价值,那么可以枚举一个 \(j\),保证 \(j\) 和 \(i\) 都归位。
\[f[i]=\max(f[j])+1
\]
其中 \(j\) 满足 \(j<i\),\(a[i]>a[j]\),\(a[i]-a[j]\leqslant i-j\)。
那么这看起来很三维偏序,cdq?
但仔细一想,\(i-a[i]\geqslant j-a[j]\),再保证了 \(a[i]>a[j]\) ,第一维就自然满足了。
这就变成了二维偏序,树状数组即可。