「总结」$pdf$课:$dp$

枚举根
可以把每个点抽象成从这个点到根路径上的点全部+1,规则改为两个点可以消去。
不同子树显然不属于同一个集合。
我们可以进行操作。
对于一个点来说。
相当于给予一个\(a\)数组。
求最终剩下的个数和消去的次数。
那么分\(sum-a_{max}>=a_{max}\)\(sum-a_{max}<a_{max}\)进行讨论即可\(dp\)出当前根的答案。

我们可以发现答案是这种形式。

\[c(i)=\sum\limits_{num[j]=i}10^j \]

\[ans=\sum\limits_{i=1}^{9}ic(i)=\sum\limits_{i=1}^{9}\sum\limits_{j=i}^{9}c(i) \]

可以转化为大于等于某个数出现次数的计数。
直接数位\(dp\)就可以。

构造子序列自动机。
考虑状态\((S,T)\)表示\(S\)后面接上一个串\(T\)的子序列。
这张图是\(DAG\)
建图之后考虑对于每一个串计数这个串是多少个串的子序列。
求出字典序最小的满足条件的即可。

对于每一个位置取最小限制。
然后转化成多个限制中必须至少有一个取最大值的。
那我们处理出每一个点最靠左的最大值的位置是\(L[i]\)
然后设\(dp[i][j]\)为前\(i\)个点,最后一个满足最大值的\(j\)的方案。
就可以直接\(dp\)了。

分区间考虑
\(dp[i][j][k]\)为区间\([i,j]\)的最小值为\(k\)的最大收益。
然后和区间一样枚举最小值的位置转移就可以了。
这就是笛卡尔树\(dp\),每次枚举的位置两侧的最小值一定要大于当前位置。

根据\(H\)建出笛卡尔树。
相当于每次消掉最下一层的节点。
\(dp[i][j]\)为当前节点\(i\)的子树里面选了\(j\)个车的方案。
剩下的列必然只有\(sz[i]-j\)个。
行的范围就是当前表示的矩形。

我们考虑从前向后决定元素。
那么可以确定第\(i\)个元素在前\(i\)个元素的相对大小来使得逆序对的增加量恰好为\([0,i-1]\)
枚举\(j\)\(i\)的祖先,从\(i\)\(j\)的方向和\(i\)\(j\)的方向分别确定每个元素在当前排列中的相对大小。
可以发现此时除了这一对\(i,j\)外。
其他点的贡献都是\([0,k-1]\)\(dp\)的时候先假设\(i,j\)的贡献也是\([0,i-1]\),然后撤销掉这一贡献即可。

\(f[i][j]\)表示\(S\)的前\(i\)位和\(T\)的前\(j\)位匹配的最长长度。
那么我们设\(dp[i][S]\)表示\(S\)的前\(i\)位中,\(f[i]\)的具体差分情况为\(S\)的方案。
因为\(0\leq f[i][j]-f[i][j-1]\leq 1\),所以差分可以用二进制表示。
这就是\(dp\)\(dp\)

假设我们要求的\(and\)值为\(w\)
那么我们可以设\(dp[i][a][b][c][d]\)表示前\(i\)位中\(x\)\(y\)分别与\(L_x\),\(R_x\),\(L_y\),\(R_y\)的关系的\(w\)二元组对数。
然后把\(a,b,c,d\)压在一起。
变成\(dp[i][S]\)即可。

假设已经知道了格子的颜色可以用插头\(dp\)判断是否可行。
\(f[S]\)为轮廓线上匹配状态为\(S\)是否可行。
那么我们套一个\(dp\)上来。

\[dp[i][j][C][S] \]

\(dp\)\((i,j)\)这个格子轮廓线上的颜色为\(C\)\(f\)的结果为\(S\)的方案数。

仍然设\(dp[i][k]\)为前\(i\)位,选了\(k\)段的最优值。
然后显然可以用决策单调性整体二分优化决策转移。
分治的时候用类似莫队的方法搞出每一块的贡献即可。
复杂度还是\(O(nklogn)\)

posted @ 2020-03-17 18:17  Lrefrain  阅读(107)  评论(0编辑  收藏  举报