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两类主要的转移套路

  • 相关阅读:
    今天整理一下以前各博客网站上的文章
    转一篇详解Excel逻辑函数的文章
    Google中国的首页变化
    [转]在QuantumGrid4.5中手动添加数据
    [转]VISTA服务介绍
    Idiomatic Phrases Game zoj 2750 Dijkstra
    Fleury 求欧拉回路
    QS Network ZOJ 1586 Prim
    Burn the Linked Camp ZOJ 2770 差分约束系统 SPFA
    ZOJ 1092 POJ 2240 Arbitrage Floyd
  • 原文地址:https://www.cnblogs.com/Frather/p/14375216.html
Copyright © 2011-2022 走看看