DP学习总结
动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 -----OI Wiki
例.1-最大子段和
分析
DP四步
⑴定义状态
定义\(dp_i\)表示以\(i\)结尾的最大子段和
⑵分析答案
答案即\({\max}^{i\in[1,n]}_{dp_i}\)
⑶分析方程
对于每个\(i\):
- 可以与\([1,i-1]\)的最大子段和拼接,组成新的子段和\((dp_{i-1}+a_i)\)
- 可以自己单独成一个子段和\(a_i\)
求\(\max\)
⑷边界条件
即\(dp_1\)为\(a_1\)
代码实现
递归写法
定义\(f(i)\)为以\(i\)结尾的最大子段和
则递归分析即可
int f(int x){
if(x==1){//边界条件
return a[1];
}
return max(f(x-1)+a[x],a[x]);//求最大值
、}
这样时间很慢,原因是存在许多已经算过的节点被重复计算
所以用一个\(val\)记录计算过的节点信息
for(int i=1;i<=n;i++){
dp[i]=inf;
}
int f(int x){
if(dp[x]!=inf){
return dp[x];//已经记录过的节点信息
}
if(x==1){//边界条件
return a[1];
}
dp[x]=max(f(x-1)+a[x],a[x]);//求最大值
return dp[x];
}
上述优化方法即记忆化搜索,是一种基本DP方法
记忆化搜索是一种通过记录已经遍历过的状态的信息,从而避免对同一状态重复遍历的搜索实现方式。 ------OI Wiki
转成递推形式就成了基本的线性DP
dp[1]=a[1];
for(int i=2;i<=n;i++){
dp[i]=max(dp[i-1]+a[i],a[i]);
maxi=max(maxi,dp[i]);
}
例.2-最长上升子序列(LIS)
分析
DP四步
⑴定义状态
定义\(dp_i\)表示以\(i\)结尾的最长上升子序列长度
⑵分析答案
答案即\({\max}^{i\in[1,n]}_{dp_i}\)
⑶分析方程
对于每个\(i\),有若干\(j<i\)且\(a_j<a_i\):
- 可以与每一个\(j\)的最长上升子序列拼接,组成新的子序列长度\((dp_{j}+1)\)
- 可以自己单独成一个子段和\(1\)
求\(\max\)
⑷边界条件
即\(dp_i\)为\(1\),因为每个\(dp\)值至少为\(1\)
代码实现
使用递推,枚举\(i\),并且枚举\(j(j<i)\)
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=1;j<i;j++){
if(a[j]<a[i]){
dp[i]=max(dp[j]+1,dp[i]);
}
}
maxi=max(maxi,dp[i]);
}
重点题-导弹拦截
50分做法
第一小问即求最长不上升子序列长度
第二问可以用Dilworth 定理解决
把序列分成不上升子序列的最少个数,等于序列的最长上升子序列长度。把序列分成不降子序列的最少个数,等于序列的最长下降子序列长度。
所以第二问等价于求最长上升子序列长度
100分做法
使用贪心优化如果,如果一个位置可以有\(2,3\)两个数选一个数,我们一定会选\(2\),因为选2后面就有更多的机会拼接。
定义一个\(c\)数组存贮已经选了的数
只要每次二分查找第一个能够等价替换的数,就能将其替换,在过程中记录DP即可。
补充
DP的要素:
- 数据范围较小
- 可以拆解为多个子问题
DP学习总结的更多相关文章
- 记忆化搜索 dp学习~2
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...
- 数塔~~dp学习_1
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 数塔 Time Limit: 1000/1000 MS (Java/Others) Mem ...
- 数位DP学习笔记
数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...
- 斜率优化DP学习笔记
先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...
- DP学习笔记
DP学习笔记 可是记下来有什么用呢?我又不会 笨蛋你以后就会了 完全背包问题 先理解初始的DP方程: void solve() { for(int i=0;i<;i++) for(int j=0 ...
- MMM 数位dp学习记
数位dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...
- MMM 状压dp学习记
状压dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...
- 插头$DP$学习小结
插头\(DP\)学习小结 这种辣鸡毒瘤东西也能叫算法... 很优秀的一个算法. 最基本的适用范围主要是数据范围极小的网格图路径计数问题. 如果是像\(Noi2018\)那种的话建议考生在其他两道题难度 ...
- DP学习记录Ⅰ
DP学习记录Ⅱ 前言 状态定义,转移方程,边界处理,这三部分想好了,就问题不大了.重点在状态定义,转移方程是基于状态定义的,边界处理是方便转移方程的开始的.因此最好先在纸上写出自己状态的意义,越详细越 ...
- DP学习记录Ⅱ
DP学习记录Ⅰ 以下为 DP 的优化. 人脑优化DP P5664 Emiya 家今天的饭 正难则反.考虑计算不合法方案.一个方案不合法一定存在一个主食,使得该主食在多于一半的方法中出现. 枚举这个&q ...
随机推荐
- 微信小程序block的作用
有了block标签过后,你就可以把if 或则 for 语句写在block标签里面; 这样就控制了这一块的逻辑. 个人建议是要是v-if和v-for的都可以写在block上: block并不是一个组件, ...
- mysql之PreparedStatement的增删改
编写配置文件[db.properties]: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcStudy?useUni ...
- Linux驱动---按键
目录 一.Input子系统 1.1.简介 1.2.Input子系统构成 1.3.input_dev结构体 二.输入设备驱动开发流程 2.1.分配和初始化输入设备 2.2.注册设备 2.3.事件上报 2 ...
- test1111
了解客户端和服务端的请求原理 HTTP协议及其组成 HTTPS交互原理分析 访问支付宝,微信的开放接口 都是基于HTTP 对外提供的开放服务 API都是基于HTTP协议的, 微服务中的服务之间的调用大 ...
- OpenOffice已停更六年 文档基金会呼吁用户迁移LibreOffice
OpenOffice 源代码发布至今已经有 20 年了.文档基金会近日发布公开信,表示说:"LibreOffice 是 OpenOffice 的未来.我们将会全力以赴".以此呼吁那 ...
- Cython与CUDA之Add
技术背景 在前一篇文章中,我们介绍过使用Cython结合CUDA实现了一个Gather算子以及一个BatchGather算子.这里我们继续使用这一套方案,实现一个简单的求和函数,通过CUDA来计算数组 ...
- 【Python】转载一个python 爬虫的帖子
原帖地址 原帖标题:爬取图网的4K图片自动保存本地 https://www.52pojie.cn/thread-1809600-1-1.html (出处: 吾爱破解论坛) python 代码 impo ...
- 【基础知识】回头看Maven基础
版本 日期 修订人 描述 V1.0 2025/3/7 nick huang 创建文档 背景 项目过程中,对于Maven的pom.xml文件,很多时候,我通过各种参考.仿写,最终做出想要的效果. 但实际 ...
- 2025年我用 Compose 写了一个 Todo App
标题党嫌疑犯实锤 序言 从2月12日到3月4日这整整三周时间里,我从零开始又学习了一次 Compose. 为什么说又,是因为这已经是我第二次学习这套课程了. 故事从 4 年前说起,2021 年在意外获 ...
- Ollama系列02:快速上手搭建私有的AI对话框和智能体—chatbox版
本文是Ollama系列教程的第2篇,在上一篇中我们介绍了Ollama的安装.大模型的下载和本地部署,本篇中我们将介绍如何将Ollama整合到chatBox中,并构建属于自己的智能体. Ollama系列 ...