首页 > 其他分享 >DP学习总结

DP学习总结

时间:2024-11-17 20:41:16浏览次数:1  
标签:总结 子段 int max 学习 DP 序列 dp

动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 -----OI Wiki

例.1-最大子段和

分析

DP四步

⑴定义状态

定义\(dp_i\)表示以\(i\)结尾的最大子段和

⑵分析答案

答案即\({\max}^{i\in[1,n]}_{dp_i}\)

⑶分析方程

对于每个\(i\):

  1. 可以与\([1,i-1]\)的最大子段和拼接,组成新的子段和\((dp_{i-1}+a_i)\)
  2. 可以自己单独成一个子段和\(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\):

  1. 可以与每一个\(j\)的最长上升子序列拼接,组成新的子序列长度\((dp_{j}+1)\)
  2. 可以自己单独成一个子段和\(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即可。

具体代码

标签:总结,子段,int,max,学习,DP,序列,dp
From: https://www.cnblogs.com/OIer-QAQ/p/18551071

相关文章

  • 【AI日记】24.11.12 东京贫困女子读后感 | 未来学习工作时间分配
    【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】读书豆瓣地址:东京贫困女子时间:3小时评估:不错,完成感想:这本书读的有点压抑,因为越到后面越惨,有些地方看着看着就眼眶湿润了。书中多次提到了日本看护业的问题,本来我想接着看《看护sha人》这本书进一......
  • Java学习教程,从入门到精通,Java继承语法知识点及案例代码(29)
    1、Java继承语法知识点及案例代码一、继承的基本概念继承是面向对象编程中的一个重要概念,指的是子类从父类继承属性和方法的能力。通过继承,子类可以直接访问父类的非私有属性和非私有方法,实现代码重用和扩展。二、继承的语法在Java中,使用关键字extends来实现继承。子类......
  • 2024-2025-1 20241411《计算机基础与程序设计》第八周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、执行......
  • 手把手教你学pcie(14.6)--多GPU系统场景实例:基于PCIe的多GPU高性能深度学习模型训练系统
    目录项目实例:基于PCIe的多GPU高性能深度学习模型训练系统项目背景项目目标技术选型项目实施步骤1.系统建模2.数据预处理3.模型设计4.分布式训练5.性能评估项目总结基于PCIe的多GPU系统项目开发实例,我们将重点放在一个高性能深度学习模型训练系统的设计和实......
  • 《计算机基础与程序设计》第八周学习总结
    学期(2024-2025-1)学号(20241300)《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程<班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标功能设计与面......
  • 2024-2025-1 20241427 《计算机基础与程序设计》第8周学习总结
    作业信息这个作业属于哪个课程[2024-2025-1-计算机基础与程序设计]这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、执行作业正文https://......
  • 2024-2025-1 20241319 《计算机基础与程序设计》第八周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标功能设计与面向对象设计面向对象设计过程面向对象语言三要素汇编、编译、解释、执行作业正文https:/......
  • 第八周学习总结
    学期2024-2025-1学号20241414《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第八周作业这个作业的目标功能设计与面向对象设计面向对象设计过程面......
  • 2024-2025-1 20241327 《计算机基础与程序设计》第八周学习总结
    作业信息|2024-2025-1-计算机基础与程序设计)||--|-|2024-2025-1计算机基础与程序设计第八周作业)||快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解决的问题并在期末回答这些问题|作业正文|https://www.cnblogs.com/shr060414/p/18440575|教......
  • 2024-2025-1 20241316 《计算机基础与程序设计》第八周学习总结
    2024-2025-120241316《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程[2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里2024-2025-1计算机基础与程序设计第八周作业(https://www.......