当前位置:首页 > 后端开发 > 正文内容

DP学习总结

邻居的猫1个月前 (12-09)后端开发993

动态规划是一种经过把原问题分解为相对简略的子问题的办法求解复杂问题的办法。 -----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即可。

详细代码

弥补

DP的要素:

  1. 数据规模较小
  2. 能够拆解为多个子问题

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=250

分享给朋友:

“DP学习总结” 的相关文章

第68篇 jwt的简略介绍

第68篇 jwt的简略介绍

1.API维护 1.1 为什么要维护API 防走漏 防进犯 1.防假装进犯(事例:在公共网络环境中,第三方 有意或歹意 的调用咱们的接口) 2.防篡改进犯(事例:在公共网络环境中,恳求头/查询字符串/内容 在传输进程被修正) 3.防重放进犯(事例:在公共网络环境中,恳求被截获,稍后被重放或屡次重放)...

安装python,从入门到环境配置

安装Python是一个简单的过程,但具体的步骤可能会因操作系统和版本而有所不同。下面我会提供在Windows、macOS和Linux上安装Python的基本步骤。请注意,Python 3和Python 2在安装和配置上有所不同,我这里主要介绍Python 3的安装方法。 Windows系统1. 下载...

怎么打开php文件,全面指南

在Windows系统中,你可以通过以下步骤打开PHP文件:1. 安装PHP环境:确保你的计算机上安装了PHP环境。你可以从PHP官方网站下载并安装PHP。2. 安装文本编辑器:安装一个文本编辑器,如Notepad 、Sublime Text或Visual Studio Code等。这些编辑器支持多...

rust服务器

1. Rust Web 全栈开发 课程简介:这门课程涵盖了使用 Rust 编写 Web 服务器的各个方面,包括 TCP 和 HTTP 服务器的构建。它使用 Rust 标准库中的 `std::net` 模块来创建 TCP 服务器和客户端。 2. 多线程 Web 服务器 实现方法:通过为每个请求分配...

java6,回顾与展望

java6,回顾与展望

Java 6(也称为Java SE 6)是Java编程语言的一个版本,由Sun Microsystems(现为Oracle Corporation)于2006年12月11日发布。Java 6引入了许多新特性和改进,包括但不限于:1. 脚本语言支持:Java 6支持使用脚本语言(如JavaScript...

567go,探索567go——您的智能出行新伙伴

567go,探索567go——您的智能出行新伙伴

567GO国际健身学院成立于2005年,隶属于北京全能奥菲特健身顾问有限公司,是中国知名的健身教育培训企业。学院以团体课程为核心,私人教练培训为重点,致力于为中国健身事业的发展贡献力量。567GO在全国范围内设有多个校区,包括北京、上海、广州、成都、西安、济南、杭州、大连、重庆、长沙、厦门、天津、南...