zoukankan      html  css  js  c++  java
  • 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两类主要的转移套路

  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/Frather/p/14375216.html
Copyright © 2011-2022 走看看