递推知识点小结
递推
状态
- 有什么,设什么
- 要什么,设什么
- 想什么,设什么
- 差分
- 摸
- 存路径,存字符串
- 暴力存维
状态方向
- 顺推
- 倒推
转移方程
- 策略
- 划分
- 补集
- 容斥
- 费用提前计算
- 阶段内转移(多选)
转移方向
- 顺转移(压范围)
- 逆转移
循环位置
枚举顺序
- 顺序(单选)
- 倒序(无限选,多选可以转向此处记次数)
- 区间枚举(区间划分问题和区间递推)
实现方式
- dfs
- bfs(拓扑排序)
- 阶段
考虑角度
- 单调性
- 维护的角度
- 最优解与不优解的充分和必要条件
- 单个问题,忽略条件,整体来看,状态思想
- 递推优化dfs
- 重
- 分
- 少
最优子结构性质
- 加法恒满足
- 不满足分类讨论
试填法
标志
- 求第几个方案
- 求方案
做法
- 求方案
- 从大到小试填
- 求出确定了这个状态下的方案数
模型
- 序列划分成区间
线性递推
序列
其实就是子序列问题
LIS
\(f_i=\max_{j=1}^{i-1}(f_j)+1\)
\(f_{++t}=a_i(a_i\geq f_t)\)
\(f_j=a_i(f_j>a_i),j\)尽可能小
(贪心优化)
lCS
\(f[i][j]=\max(f[i-1][j],f[i][j-1])(a[i]\neq b[j])\)
\(f[i][j]=f[i-1][j-1]+1(a[i]=b[j])\)
LCIS
\(f[i][j]=f[i][j-1](a[i]\neq b[j])\)
\(f[i][j]=\max_{k=1,a[k]\leq b[j]}^{i-1}(f[k][j-1])(a[i]=b[j])\)(决策集合优化)
成为LIS的最少修改次数
len(总)-len(LIS)
成为LSIS的最少修改次数
len(总)-len(LSIS(b))\((b_i=a_i-i)\)
切入点
- 前i个(可以表现结尾)和以第i个结尾
方法
- 构造新序列
网格图问题
考虑点
- 行列
- 对角线
- 矩形(枚举2个顶点,cow式枚举)
- 轮廓
- 长宽为1
奇特思路
- 拆行成列
- 行列独立
背包
01
\(f[i][j]=max(f[i][j],f[i-1][j-w_i]+c_i)\)
\(f_j=max(f_{j-w_i}+c_i,f_j)\)(倒序枚举)
完全
\(f[i][j]=max(f[i][j-w_i]+c_i,f[i-1][j])\)
\(f_j=max(f_j,f_{j-w_i}+c_i)\)(顺序枚举)
多重
- 01二进制拆分
- 单调队列
- 可行性问题转完全记次数
分组
\(f[i][j]=max(f[i][j],f[i-1][j-w_k]+c_k)\)
\(f_j=max(f_j,f_{j-w_k}+c_k)\)(倒序枚举)
区间问题
切入点
维护
- 枚举右端点,寻找左端点性质
关系
- 左右端点排序
- 包含
状态
- 位置,区间(设的状态)
区间递推
标志
- 相邻两点合并
- 具有区间性(如dfs序)
模型
dfs序
- 根节点在序列中划分子树
- 一段区间可以对应一棵子树
- 子树可以拆分,区间也可以拆分
环形递推
切入点
- 先拆环成链,再
- 再补一截
- 二次递推
- 记录一截
拆环划分
- 区间长度作为阶段
进制压缩
标志
1~20间的数据范围,即极小的数据范围
切入点
- 不限于二进制(二进制更快)
- 灵活运用二进制运算(\(\wedge,\&,|,!\),~)
- 多预处理
- 多剪枝
绝对值问题
切入点
- 拆
- 存
模型
- \(\sum_{i=1}^n|x-a_i|\)最小,取中位数
- \(\sum_{i=1}^n|b_i-a_i|\)暴力存维
有后效性的递推
高斯消元
细节
- 先增广后eam防错
- 从最高位消比较好
数学期望
切入点
转移方式 | 特点1 | 特点2 | 特点3 |
---|---|---|---|
公式 | 概率很固定 | 枚举方案 | 要判非法状态 |
顺推 | 概率较固定 | 阶段转移 | 要判非法状态 |
倒推 | 概率不固定 | 点点转移 | 不判非法状态 |
- 样本空间无限无后效性递推处理
模型
条件概率
切入点:数学归纳法证明概率相等
二进制运算
切入点:
- 二进制运算不进位
- 间接概率转移
有向无环图
切入点:
单个点,单条边,环,图转dag,dag转树,森林合并
异或和路径
切入点:
- 线性基
- 瞬间转移
- 环环转换
- 二进制拆分
细节
- 自环
数据范围
1~5暴力存维
1~20进制压缩
50~100 \(O(n^4)\)
100~300 \(O(n^3)\)
1000~9000 \(O(n^2)\)
$10^5$ \(O(n\sqrt{n})\)
$10^6$ \(O(nlog^n)\)
$10^7$ \(O(n)\)
\(10^9\)~ \(O(log^n)\)
树形递推
标志
- 有依赖的类背包问题
- 树上的问题
切入点
- 森林合并
- 无根变有根
- 换根法二次递推(不限于最优化问题,如要求多个节点特征也可用)
细节
- 叶结点特判
优化
预处理
贪心,排序
转换模型
二进制优化
二进制压缩
倍增
- 转移方向确定
- 循环节
- 同余
- 最值(ST表)
- 第k大
二进制拆分
二分
空间优化
滚动数组
- 异或版
- 与版
动态数组
- vector
- new
区间和
前缀和
树状数组
性质
- 一棵树
- x所包含的数据范围为\(x-lowbit(x)+1\sim x\)
- x的父节点为\(x+lowbit(x)\)
- x的最远子节点为\(x-lowbit(x)+1\)
- x的子节点为\(x-2^k\),其中,\(0<2^k<lowbit(x)\)
区间最值维护
- 修改
- 更改原数组
- 暴力从子节点中获取数据
- 跳到下一个节点
时间复杂度:\(O((log_2^n)^2)\)
- 查询
- 如果r的包含数据范围在\([l,r]\),计入答案
- 如果不包括,查询\([l,r-1]\)
时间复杂度:\(O((log_2^n)^2)\)
线段树
- 区间合并性
- 区间信息快速更新性(标记下放)
维护
基本思想
- (思路)从简单到困难,特殊到一般
- (枚举)确定一个枚举点,再寻找最优解,提供暴力
- (信息)利用以前的信息求出现在的信息
栈与队列
单调性
单调队列
- 决策范围单调
优先队列
如双堆对顶(动态维护第k大)
平衡树
可维护最值
二分(二分,三分查找)
离散化
列式
其他维护方式
矩阵快速幂
辅助1
斜率优化
截距版
- 单调队列——决策范围单调+斜率单调
- 单调队列+二分查找——决策范围单调or斜率单调[倒推]
- 多比较平衡树——无单调性
斜率版
思路过程(可以推广到整个斜率优化)
- 上凸三角形和下凸三角形以及其本质
- 维护上下凸壳
- 单调队列和平衡树
- 函数的单调性,用图像研究问题
- 只考虑问题的三个点,简化研究,再推广
四边形不等式
常见模型
最大相同矩阵
- 按行枚举,再按列枚举
- 暴力预处理高度
- 单调队列维护该列最左能到达范围
数列前缀和
- 分治
- 矩阵快速幂
- 倍增前缀和
一维无乘积决策单调性
\(l_i\)是否单调 | \(a_j\)是否单调 | \(r_i\)是否单调 | 维护办法 |
---|---|---|---|
是 | 是 | 是 | 单调队列;离散化+线段树or树状数组 |
是 | 是 | 否 | 离散化+线段树or树状数组 |
是 | 否 | 是 | \(double\ set\);离散化+线段树or树状数组 |
是 | 否 | 否 | 离散化+线段树or树状数组 |
否 | 是 | 是 | 离散化+线段树or树状数组 |
否 | 否 | 是 | 离散化+线段树or树状数组 |
否 | 是 | 否 | 离散化+线段树or树状数组 |
否 | 否 | 否 | 离散化+线段树or树状数组 |
习题
随机序列
有一个长度为n的随机序列,元素范围\([1,x]\),每个数出现在每个位置概率固定,接下来有m次试验,每次实验有一个\([l,r]\)表示研究随机序列的区间\([l,r]\),并生成一个随机序列,把试验结果记做区间中的最小值,现在询问所有试验结果最大值的期望,\(x,n\leq 300\)。
迁徙
有n个东西向的村庄,自西向东标号为1~n,第i个村庄有一个属性\(a_i,b_i\),定义两个村庄i,j(i<j)的距离\(dis(i,j)=\sum_{k=i}^jb_k\)。
现在有q个人,每个人有一个大转盘和一个要行走的最多距离x,转盘上有36个点,标号1~36,有一个点p被标记,从村庄s出发,向东移动,如果目前停留的村庄为i,就把一个球放在转盘上的点1,每次顺时针旋转\(a_i\)格,如果能够走到点p,则下一个前往的村庄j为满足\(a_i\geq a_j\)条件下,距离最近的村庄,如果不能走到p,则下一个前往的村庄j为满足\(a_i< a_j\)条件下,距离最近的村庄,如果不存在下一个前往的村庄,就停止不动,请输出每一个人所能最终到达的村庄编号。
\(1\leq n\leq 10^5,1\leq a_i,b_i\leq 10^9,1\leq p\leq 36,q\leq 10^5\)
奇怪的多元组
给出n个\(m\)元组以及其序号,现在有q个询问,由三种询问组成:给出m元组的序号,删除这个m元组;加入一个m元组;给出数字a,b,表示查询m元组中第a元的最小值。\(n\leq 10000,m\leq 100,q\leq 5000\).
决斗
给出一个\(n\times m\)的网格图,保证m为奇数,从网格第一行的中间开始,在第一行的上面放上数字\((m+1)/2\),然后一次向两边放数字,放的数字依次递减,如\(m=5\),你应该放的是\(1\ 2\ 3\ 2\ 1\),现在有一个人在网格图上,初始位置\((s,t)\)已经给出,背对着第一列,现在该人可以等概率向上,向下,向右,向左,留在原地转身射击,询问其射中的数字的数学期望,\(n,m\leq 1000\)。