前言:线性DP是DP中最基础的。趁着这次复习认真学一下,打好基础。

------------------

一·几点建议

1.明确状态的定义

比如:$f[i]$的意义是已经处理了前$i个元素,还是处理第$i$个元素?这对于后期的调试非常重要。

2.明确边界状态

比如:$f[0]$是等于$0$还是等于$1$又或是$f[0]=a[1]$?当然,只有明确了状态的定义,才能明确边界。

3.明确转移

要想明白转移的顺序。例如完全背包和01背包,其不同就在于$j$的枚举顺序不同。这不得不让人注意。

另一方面,DP的转移有两种写法,以线性DP为例:

1.要算$f[i]$,在$i$之前找转移:$f[i]=max/min(f[j]+value)$。

2.算完$f[i]$,用$f[i]$更新后面状态,$f[j]=max/min(f[i]+value)$。

根据问题的特殊性,灵活转换思路。

4.有时候DP可以转化成记忆化搜索

当冗余状态比较多时,可以用记忆化搜索,降低常数。

二.正题

给定一个序列$a_{i}$。求序列的最长上升子序列。

1.暴力枚举。不难得出状态转移方程:$f[i]=max(f[j]+1,f[i])$(当$j\leq i$并且$a[j]<a[i]$)时间复杂度$n^2$。

2.单调栈。设$f[i]$为长度为$i$的序列的最小末尾数值。

这种方法类似于贪心。很好理解,如果末尾的数值越小,那么更有可能把序列中后面的数加进来。时间复杂度$nlogn$。

-----------------------------

求两个串的最长公共子序列。

我们定义$f[i][j]$为第一个串前$i$个,第二个串前$j$个的最长公共子序列长度。

如果$a[i]=b[j]$,那么有$f[i][j]=max(f[i][j],f[i-1][j-1]+1)$。

如果不相等,考虑继承:$f[i][j]=max(f[i-1][j],f[i][j-1])$。

------------------------------------

求一个序列的最大子段和。

1.暴力:$O(n^2)$。枚举左右端点。

2.分治:$O(nlogn)$。我一般用线段树实现。

3.动态规划。时间复杂度$O(n)$。设$f[i]$为从$i$开始向前延伸的最大子段和。则有$f[i]=max(f[i-1]+a[i],a[i])$。边界$f[1]=a[1]$。

-----------------------------------------

给定一个序列,将其划分成不超过$k$个子区间,最小化每个区间和的最大值。

我们设$f[i][j]$为已经处理了前$i$个元素,划分成$j$个区间的最大值。

1.暴力:时间复杂度$n^3$。有转移$f[i][j]=max(f[k][j],\sum_{i=k+1}^n a[i])$。

2.二分答案:刷表,看值是否都小于$mid$。

3.转化成“可行性解”。设$f[i]$为前$i$个数最少划分成多少段是合法的。则有$f[i]=min(f[j]+1|\sum_{k=j+1}^i a[k]<mid)$。

--------------------------------------------

后记:这里讲的都是模板,做题的时候还是要自己学会转化。有时候对于题面不清楚可以自己试着模拟一下,一般都能找到转移方法。

线性DP 学习笔记的更多相关文章

  1. 数位DP学习笔记

    数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...

  2. DP学习笔记

    DP学习笔记 可是记下来有什么用呢?我又不会 笨蛋你以后就会了 完全背包问题 先理解初始的DP方程: void solve() { for(int i=0;i<;i++) for(int j=0 ...

  3. 树形DP 学习笔记

    树形DP学习笔记 ps: 本文内容与蓝书一致 树的重心 概念: 一颗树中的一个节点其最大子树的节点树最小 解法:对与每个节点求他儿子的\(size\) ,上方子树的节点个数为\(n-size_u\) ...

  4. 斜率优化DP学习笔记

    先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...

  5. java线性表学习笔记(一)

    线性表是一种按顺序储存数据是的常用结构,大多数的线性表都支持以下的典型操作: 从线性表提取插入删除一个数据: 找出线性表中的某一个元素: 找出线性表中的元素: 确定线性表中是否包含某一个元素,确定线性 ...

  6. 动态dp学习笔记

    我们经常会遇到一些问题,是一些dp的模型,但是加上了什么待修改强制在线之类的,十分毒瘤,如果能有一个模式化的东西解决这类问题就会非常好. 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y ...

  7. 动态 DP 学习笔记

    不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子 ...

  8. [总结] 动态DP学习笔记

    学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就 ...

  9. 插头DP学习笔记——从入门到……????

    我们今天来学习插头DP??? BZOJ 2595:[Wc2008]游览计划 Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该 ...

随机推荐

  1. python基础内容扩展复习

    目录 一.关于编辑器 二.解释型和编译型 三.数据类型 1 一切皆对象 2 深浅拷贝 3 可变类型和不可变类型 四.闭包函数 一.关于编辑器 python开发:pycharm(收费),vscode(免 ...

  2. Linux上运行安卓应用:安装使用Anbox

    文章目录 #0x0 简介 #0x1 安装教程 #0x11 第一步,安装需要的内核模块 #0x12 安装Anbox #0x2 使用Anbox #0x21 一些简单的设置 #0x22 安装APK #0x3 ...

  3. 微信支付之获取code

    微信支付之获取code, 1:访问下面的连接(自己拼) 2:去回调地址里拿code https://open.weixin.qq.com/connect/oauth2/authorize?appid= ...

  4. 百万级别数据Excel导出优化

    前提 这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出. 笔者负责维护的一个数据查询和数据导出服务是一个相对远古的单点应用,在上一次云迁移之后扩展为双节点部署,但是发现 ...

  5. java 面向对象(二十四):interface:接口

    interface:接口1.使用说明: 1.接口使用interface来定义 * 2.Java中,接口和类是并列的两个结构 * 3.如何定义接口:定义接口中的成员 * * 3.1 JDK7及以前:只能 ...

  6. web自动化测试实战之批量执行测试用例

    01实战之分离测试固件 在UI 自动化测试中,不管编写哪个模块的测试用例,都需要首先在测试类中编写测试固件初始化WebDriver类及打开浏览器,执行登录,才能进行下一步业务逻辑的操作,测试用例执行完 ...

  7. javascript : 点击按钮,把某标签中的内容复制到剪贴板

    需求如题. 静态页面如下. 需要的库:jquery(不用应该也能做). 浏览器:PC chrome 68 Mobile MIUI9.5(Android 7) <p>1.用电脑打开网址:&l ...

  8. metaspolit下UAC提权以及日志清除

    在获得webshell时但权限不够大,这时候为了完全获得受害者机器的权限,使用msf进行后渗透. 一.获取Meterpreter会话 Meterpreter 是msf的一个payload,目标执行之后 ...

  9. IOS上传图片方向问题

    在显示上传完毕的图片的时候遇到了一个问题, 图片莫名其妙被逆时针旋转了90度就很离谱 如下图 经过一番查询, 原来是 IOS 的相机拍照的时候会把方向角写入到图片里面 因为我用的是 element 的 ...

  10. JAVA I/O基本操作

    JAVA I/O基本操作 JAVA文件操作 JAVA字节流 JAVA字符流 JAVA缓存流 JAVA对象流 JAVA数据流 本文主要借鉴以下博客和网站: how2j.cn 深入理解java中的I/O ...