qbxtday1笔记
莫大的悲哀啊!
你们不要看 LuoGu 的题目评价哦,那没意思,这算个啥题。(紫题。。。)
刘关羽同学。。。
弹弹弹弹弹弹弹弹弹弹弹弹。。。。弹走那些不好的东西
怎么捣鼓捣鼓呢?en?怎么捣鼓?
我再 \(cong\) 新讲一遍。。。
DP
状态
定义
-
需要有状态表示和最优值(方案值)
-
表示当前子问题的解的局部
条件
-
具有最优化子结构
-
具有简洁性
-
同时能够全面的描述一个局面
转移
通过已经计算出的子结构向更全面或更优的子结构求解。
时间复杂度
-
一般简单DP时间复杂度 = 状态数 \(\times\) 转移复杂度。
-
两种DP优化方式
- 减少方案维数
+加速状态转移
例题
1.最长上升子序列
2.P1091 合唱队形
左边最大上升子序列长度,右边最大下降子序列长度。
最后总长度减去左减去右。
设
\(f[i]\) 表示以 \(i\) 结尾的最长上升子序列
\(g[i]\) 表示以 \(i\) 开头的最长下降子序列
枚举哪个 \(i\) 使 \(f[i] + g[i]\)最大。
3.乘积最大
设有一个长度为 \(n\) 的字符串,要求用 \(k\) 个乘号将其分成 \(k+1\) 个部分,使之乘积最大。
复杂度 \(O(n^3)\)
4.最长公共子序列
给定两个字符串 \(s\) 和 \(t\),长度为 \(n\) 和 \(m\) ,求解这两个字符串的最长公共子序列。
分情况:
-
如果 \(s[i]==t[j]\),
\[f[i][j]=f[i][j-1]+1 \] -
如果 \(s[i]!=t[j]\),
\[f[i][j]=max\{f[i-1][j],f[i][j-1]\} \]
最后答案 \(f[n][m]\)
5.最长公共上升子序列--分析性质优化状态转移
设
\(f[i][j]\)
表示A前 i 个位置 和B前 j 个位置能产生的最长公共子序列的长度。
若是 A[i]!=B[i],则对应函数值为0;
记忆化搜索
定义
搜索时第一次调用把答案记录下来,之后调用的时候不重新算,直接返回之前已经计算完成的结果。
瞎搞
例题
1.网格图路径计数问题
2.滑雪
二维矩阵,求最长连续下降路径。
\(f[i][j]\) 存储当前位置下山的最大长度,它等于它旁边(上下左右)比它矮的 f 值 + 1
BZOJ4562 食物链
给定 \(n\) 个点 \(m\) 条边的有向无环图,求其中多少条极长路径。
- 拓扑图经典题
设
\(f[u]\) 为u节点为终点的食物链数量
拓扑DAG
1.bzoj1003
区间序列 区间DP
2.bzoj1296
-
如果只有一条木板,那么g[i][j]表示前 i 个格子刷 j 次的最多正确格子。
\[g[i][j] = max \{ g[k][j-1] + w(k+1,i) \} \]\[g[i][j][o] = max \{ g[i-1][j-1][1] + (o==color[i] ? 1 : 0) , g[i-1][j][o] + (o==color[i] ? 1 : 0) \} \]\(w(x,y)\) 为第 x 到 第 y 个格子的最多同色格子数,哪个颜色出现的多刷那个,直接记一个前缀即可。
括号序列模型及解法
CF314E
给定一个长度为 \(n\) 的仅包含 \((\) 和 \(?\) 的字符串,将问号变成左括号或右括号使得该括号序列合法化,求方案总数。
往往把左括号看成 \(+1\) ,右括号看成 \(-1\) 。
我们只需要保证任何一个前缀序列大于等于 \(0\) ,且总和为 \(0\) ,就代表这个括号是合法序列。
令 \(f[i][j]\) 表示当前第 \(i\) 个字符,现在还有 \(j\) 个左括号。
分三种情况考虑。
。。。
BZOJ4922
给出一些括号序列,要求选择一些括号序列拼接成一个合法的括号序列,使得总长最大。
设 \(f[i][j]\) 为前 i 个括号序列 -1 和 1 的和 j 个时选出括号序列最长时的长度和。
BZOJ3709
一套有趣的题目
1.栈
-
卡特兰数
-
排列组合
2.一道经典题
有 \(n\) 个数,选择其中若干数,使得每连续 \(k\) 个数中都至少有一个数被选中,且选出的数的和最小。
-
小范围( \(O(n^2)\) ):
\[f[i] = min \{ f[j] + a[i] \} \] -
优化:
单调队列优化
\[f[i] = min \{ f[j] \} + a[i] \]核心:
及时弹出队列中对答案贡献一定不如 \(i\) 的元素
合并石子
CF245H
POJ3280
给定长为 \(m\) 的字符串,其中有 \(n\) 种字符,每种字符都有两个值,分别是插入这个字符的代价,删除这个字符的代价,求将原先给出的那串字符变成一个回文串的最小代价。
设
\(f[i][j]\) 表示区间 \([l,r]\) 有多少回文子串
转移:
环形问题
断环为链
能量项链
设
\(f[i][j]\)