区间dp
1.石子合并
区间dp n3方
随 i 增加 k 单调不降 优化成 n2
2. cf1025D
gcd 预处理出来
n4 f[i][j][k] 区间 i j 以 k 为跟的二叉树是否存在
n3 f[i][j][0/1]表示区间 i j 根节点在左端还是右端 转移变成 o1
g[i][j][0/1] 区间 i j 根节点为 i/j 的二叉树是否存在 枚举k 与 j 互质 ,则可以作为根 转移复杂度 O(n)
二叉树的一个中序遍历对应一个区间
3. 多重背包
O(nvk)
单调队列优化
f[i][j] = f[i-1][j-k*v]+w;
k*v 相当于一条链 在 %v 意义下 v+p 2*v+p 3*v+p 是相同的
能转移过来的状态相当于一个区间 随k增加 区间移动
4.整数划分问题
划分一个数(有序)的方案数
设 f[i][j] 表示 i 个数拼成了 j 的方案数
添加一个值为 1 的数 :f[i][j]->f[i+1][j+1] 所有数+1 :f[i][j]->f[i][j+i] O(n2)
优化 : 大于 根n 的数最多有 根n 个 钦定 dp 数组中的数全部大于 根n 第一个转移变成了每次添加一个值为 根n 的数 f[i][j]->f[i+1][j+根n] 第一维 根n O(n sqrt(n));
小于 根n 的数完全背包一下
枚举有多少个数大于 根n : 假设 k 个,拼成 L F[k][L] * f[n-L] F 第一维用前缀和优化一下 f 是 < 根n 的数的方案数
根号分块思想 >根n 和 <根n 两种方法做
5. 树形dp
HAOI 树上染色
设 i 为根的子树 选了 k 个点 无法转移 不知道染色点选在哪里
枚举每条边 统计每条边的贡献 f[u][k] 枚举在一个子树选了j个黑点 剩 k-j 个黑点
转移的时候像树形背包合并
写树形背包时要小心 不要把复杂度写假
Code:
6.状压DP
枚举超集
枚举子集
例题 HNOI 公交线路
f[i][s]表示i的后 p 站停靠的状态是 s
矩乘 把 f[i] 看做一个行向量 构造一个矩阵A 使得 f[i]*A = f[i+1]
矩阵乘法满足结合律 可用矩阵快速幂 O(k3*log(n)) 当 f[i]仅有f[i-1]转移过来 就可以构造一个矩阵来优化DP了
外层状态矩乘优化掉
内层预处理出有用状态 : 始终包含 k 个 1 的状态是有用的
7.概率期望
加法原理
乘法原理
期望的线性性
SHOI 2014 概率充电器
因为一个节点带电:u 带电 或者 相邻的边带电 , "或者" 不好做,考虑u不带电,并且相邻边不带电 就很好做了
设 f[u] 表示 u 的子树,u 不带电的概率
没有考虑 father 的影响
所以 dp 两遍 这时根节点的答案是正确的
考虑子节点的答案可以由 father 节点转移过来
以v作为根,把发father节点看做根(换根法) father的答案直接除掉当前子树的答案 , 子节点答案再乘上father节点答案
8. DP优化
决策单调性优化 (打表 / yy)
有决策单调性当且仅当满足四边形不等式
维护每一段的左端点,右端点,决策点是什么 放到队列里面 按左端点排序
加入一个 k,比较k和这一段的左端点,如果左端点都劣于k,则踢掉,不然在段里二分,找到最优位置,分成两段,前一段是之前的,后一段是新加入的决策点
例题: 诗人小G
斜率优化
例题: 玩具装箱 (决策单调性 / 斜率优化) 加强版 : k次方只能决策单调性
奇技淫巧
1. WQS二分
如果答案关于某个变量 x 是凸函数 要求某个f(x) 但是不好求,但 max f(x)的值很好求 于是可以减掉一个函数, 使答案向要求的位置逼近
凸函数减掉切线,切点处取最大值
因为斜率单调 所以可以二分斜率
例题 : CF739E
n<=200
f[i][a][b]表示抓了 i 个宝贝 用了 a 个宝贝 b 个超级球
枚举怎么抓第 i 个容易转移
n<=100000
如果确定了 a 关于 b 是一个凸函数
二分套二分
O(nlog2n)
原文地址:https://www.cnblogs.com/tuchen/p/10145147.html