动态规划
序列DP
有些问题:
-
求长度为\(l\)的上升子序列个数
形如一个值域的前缀和的形式,还要支持插入,所以可以用树状数组优化DP,\(O(n^2logn)\)求解([BZOJ4361]isn)
-
求最长上升子序列长度
两种做法,前者拓展性更强
设\(f[i]\)表示到第\(i\)个位置的最长上升子序列长度,则\(f[i]=max(f[j]+1),j<=i\&\&A[j]<A[i]\),用值域树状数组优化前缀\(max\)即可
-
设\(f[i]\)表示最长上升子序列长度为\(i\)的最小结尾值,可以知道\(f\)是单调递增的。新加入一个数\(x\)时找到大于等于\(x\)的第一个位置\(j\),\(f[j]=x\),意思是长度为\(j\)的最长上升子序列可以在\(j-1\)的基础上接\(x\)而不是接\(f[j]\),同时对其他的\(f\)不影响。如果\(x\)大于了最大值,\(f\)往后加一位
如果求的是不降子序列那找到严格大于\(x\)的位置即可
关于最长上升子序列,有一个很神奇的性质:拥有双权值的序列,对其一维排序,对另一维做\(LIS\)答案相同
这个性质仿佛并没有什么用.....证明:对某一维排序并不影响两个元素间的二维偏序关系
序列为树的前序遍历,则为区间DP问题
考虑方向:
- 对区间DP
- 对长度DP
- 考虑倍增优化
背包问题
- 充分利用好题目条件,隐含着物品有无限制、不会超过\(\sqrt n\)个等条件
- 物品代价的整倍数,用同余系的单调队列优化
状态压缩以及拆分数
在点数很少的情况下可以进行状态压缩
点如果是没有区别的,可以采用拆分数进行更大数据范围的操作,再组合计数即可
\(40\)内的拆分数在\(4W\)以内
期望概率DP
马尔可夫过程
大概就是说状态可以回退,自己可以转移给自己或者自己之前的状态,这就需要高斯消元了
- [JLOI2012]时间流逝
树上马尔可夫过程,\(f[i]=Pf[fa]+(\sum f[son])+1\)
需要高斯消元但是时间不够,介绍一种 \(O(n)\)的树上高斯消元
假设\(f[i]=kf[fa]+b\),然后依次可以推导出\(f[i]=\frac{P}{1-A\sum k}f[fa]+\frac{1+A\sum b}{1-A\sum k}\),从而表示这个表示可行,然后对于每个点算\(k\)和\(b\)就可以得到根的答案了
一类生成树计数问题
树的生成方式为:每次在当前的树的结构上随机选取一个点,在其下方挂上一个结点
已经遇到的题目:
-
问期望高度(10.17T2)
设\(f[i][j]\)表示放了\(i\)个结点,高度不超过\(j\)的方案数,转移是\(f[i][j]=f[k][j-1]+f[i-k][j]\),表示为一棵树连到了另一棵树的根。最后除以阶乘即可。
-
问期望\(\sum_{i=1}^{n}\sum_{j=1}^{n}dis(i,j)\)(HAOI2018苹果树)
考虑每一条边产生的贡献,枚举\(i\)点的\(siz\),然后乘上\(1-i\)的生成方式、\(i\)子树的生成方式、其他地方的生成方式、以及i子树内选择编号的方案数
平方计数
求\(\sum a^2\)
- 如果\(a\)是到达某种状态的方案数,那么可以等价为求两种操作序列最后得到的状态相同的方案数(NOI2009管道取珠)