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\) 个部分,使之乘积最大。

\[f[i][j]=max\{f[k][j-1] \times a[(k+1)-i]\}\\k>j\\j<k<i \]

复杂度 \(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.最长公共上升子序列--分析性质优化状态转移

CF10D LCIS


\(f[i][j]\)
表示A前 i 个位置 和B前 j 个位置能产生的最长公共子序列的长度。

若是 A[i]!=B[i],则对应函数值为0;

\[f[k]=max\{f[1...i -1][k]\} \]

记忆化搜索

定义

搜索时第一次调用把答案记录下来,之后调用的时候不重新算,直接返回之前已经计算完成的结果。

瞎搞

例题

1.网格图路径计数问题

2.滑雪

P1434 [SHOI2002]滑雪

二维矩阵,求最长连续下降路径。

\(f[i][j]\) 存储当前位置下山的最大长度,它等于它旁边(上下左右)比它矮的 f 值 + 1

BZOJ4562 食物链

给定 \(n\) 个点 \(m\) 条边的有向无环图,求其中多少条极长路径。

  • 拓扑图经典题


\(f[u]\) 为u节点为终点的食物链数量

\[f[u]= \sum _{{v,u }∈E}f[u] \]

拓扑DAG


1.bzoj1003

区间序列 区间DP

2.bzoj1296

P4158 [SCOI2009]粉刷匠

  • 如果只有一条木板,那么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

[PA2014]Bohater

一套有趣的题目

1.栈

P1044 [NOIP2003 普及组] 栈

  • 卡特兰数

  • 排列组合

2.一道经典题

\(n\) 个数,选择其中若干数,使得每连续 \(k\) 个数中都至少有一个数被选中,且选出的数的和最小。

  • 小范围( \(O(n^2)\) ):

    \[f[i] = min \{ f[j] + a[i] \} \]

  • 优化:

    单调队列优化

    \[f[i] = min \{ f[j] \} + a[i] \]

    核心:

    及时弹出队列中对答案贡献一定不如 \(i\) 的元素

合并石子

P5569 [SDOI2008]石子合并

P1880 [NOI1995] 石子合并

CF245H

POJ3280

给定长为 \(m\) 的字符串,其中有 \(n\) 种字符,每种字符都有两个值,分别是插入这个字符的代价,删除这个字符的代价,求将原先给出的那串字符变成一个回文串的最小代价。

\(f[i][j]\) 表示区间 \([l,r]\) 有多少回文子串

转移:

\[f[i][j] = f[i][j-1] + f[i+1][j] - f[i+1][j-1] + ([i,j]是否是回文串) \]

环形问题

断环为链

能量项链

P1063 [NOIP2006 提高组] 能量项链

\(f[i][j]\)

\[f[i][j] = max \{f[i][i+k] , f[i][j]+f[j+1][i+k]+head[i] \times tail[j] \times tail[i+k] \]

区间DP两类主要的转移套路

原文地址:https://www.cnblogs.com/Frather/p/14375216.html