DP

考虑枚举root那么所有操作点对一定不是祖孙关系

设f(x)代表x子树中能消掉的最大对数

sum(x)代表x子树内dis之和

max(x)代表x的儿子的最大sum

那么$1>sum-max<max f(x)=sum-max+{0=<k<=f(u)|k*2<=max*2-sum}$

剩下$2max-sum$个点

其中u是max所在的点

$2>sum-max>=max f(x)=sum/2$下取整

剩下1/0个点没有被消

最后假如$roo$t合法当且仅当sum(x)是偶数且f(root)=sum(x)\2

时间复杂度$O(n^2)$

$$ans=\sum_{i=1}^{9}i*c(i)$$

c(i)代表i数字的贡献

这里考虑把i*c(i)转化成在每个小于等于i的地方累加c(i),即

$$ans=\sum_{i=1}^{9}\sum_{j=i}^{9}c(j)$$

后面的一个求和取决于有多少个大于等于i的有多少个

直接数位dp出来即可

 

 

对于每个点求出上限值

那么高度为h的限制只能由上限为h的点贡献

所以枚举h把上限为h的拿出来dp即可

n很大不能直接做感觉会很麻烦

 

其实这个思路在原来的题中出现过只是没有命名

以下的题目是笛卡尔树dp

 

 

 

 

先把权值离散化

设dp[i][j][k]代表[i,j]的最小值是k的最大花费

这里的最大花费只包含[i,j]完全覆盖的区间

枚举最小值k的位置x

$dp[i][j][k]=max(dp[i][x-1][p>=k]+dp[x+1][i][q>=k]+calc(i,j,k))$

很常见的笛卡尔树dp的思路???

 

考虑每次消掉一个H最小的当成根建出树来

那么设dp[i][j]代表i的子树中放j个的方案数

先子树合并之后考虑当前节点x的贡献

惊奇地发现是一个矩阵:

行:H[x]

列:size[x]-j

便可以做到简单统计

 

假如是一个矩阵的话

考虑逐行处理

假如某一行是黑白相间,那么下一行可以全部反转或者继承

否则只能是反转

这个是比较显然的

套上笛卡尔树解决即可变为矩阵

 

这样的问题一般的套路便是从大到小加入

考虑把原序列排序后差分一下

那么发现加入的时候贡献系数就是两边的空地的个数

所以现在我们就不关注端点是什么了

dp[i][j][k][0/1][0/1]代表到第i个元素,贡献和为j,段数为k,左右端点是否覆盖的方案数

分为新建/合并/扩展dp即可

(个人感觉差分那里多此一举,类似赤壁那题从大到小加入的时候绝对值就已经拆开了)

 

接下来便是dp套dp

 

设$f[i][j]$代表$S$的前$i$位与$T$的前$j$位的$LCS$

(这里的$LCS$是最长公共子序列,而不是最长公共后缀,第一次看的时候懵逼了好久)

转移:

$1>S[i]=T[j]\ \ f[i][j]=f[i-1][j-1]+1$

$2>S[i]!=T[j]\ \ f[i][j]=max(f[i][j-1],f[i-1][j])$

显然$f[i][j-1]=<f[i][j]<=f[i][j-1]+1$

那么可以状压每个$j$是否是$f[i][j-1]+1$

所以考虑设$g[i][j]$代表到了第$i$位,$f$的状态是$j$的方案数

预处理出每个状态之后加字符到达的状态便可以之后$O(1)$转移

复杂度$O(m2^n)$

设$dp[i][j][k][l][r]$代表考虑到了第$i$位,

$x$与$L_x$,$R_x$的关系是$i$,$j$,$y$与$L_y,R_y$的关系是$l$,$r$是否可行

转移的话就是枚举x&y的这一位是0/1

根据T的这一位来进行转移

posted @ 2020-03-19 17:52  ATHOSD  阅读(176)  评论(0编辑  收藏  举报