「总结」$pdf$课:$dp$
枚举根
可以把每个点抽象成从这个点到根路径上的点全部+1,规则改为两个点可以消去。
不同子树显然不属于同一个集合。
我们可以进行操作。
对于一个点来说。
相当于给予一个\(a\)数组。
求最终剩下的个数和消去的次数。
那么分\(sum-a_{max}>=a_{max}\)和\(sum-a_{max}<a_{max}\)进行讨论即可\(dp\)出当前根的答案。
我们可以发现答案是这种形式。
可以转化为大于等于某个数出现次数的计数。
直接数位\(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\),\(f\)的结果为\(S\)的方案数。
仍然设\(dp[i][k]\)为前\(i\)位,选了\(k\)段的最优值。
然后显然可以用决策单调性整体二分优化决策转移。
分治的时候用类似莫队的方法搞出每一块的贡献即可。
复杂度还是\(O(nklogn)\)