线性DP—入门篇

news2024/9/24 13:21:52

线性动态规划的主要特点是状态转移的推导是按照问题规模 从小到大依次推导,较大规模的问题的解依赖较小规模的问题的解。

数字三角形:

[USACO1.5][IOI1994]数字三角形 Number Triangles - 洛谷https://www.luogu.com.cn/problem/P1216我们来看一道经典的问题数字三角形问题,这个问题应该是每一个学DP的人都会遇到的问题。

闫式DP分析法:

 算法分析:

我们用两维来表示状态,将f[i][j]分为从左上方走下来还是从右上方走下来,然后我们取一个max 最后加上该点的权值即可。

注意:

如果我们遇到f[i][j]的值存在负数的情况的时候,边界上的点(不存在从左上方的点和不存在右上方的点)在计算的时候可能出错,我们需要对f[i][j]进行初始化为负无穷即可。

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1010,INF = 1e8;

int n,res;

int a[N][N],f[N][N];

int main()
{
	scanf("%d",&n);
	
	for(int i =1 ;i <= n ;i ++)
		for(int j = 1;j <= i ; j++)
			scanf("%d",&a[i][j]); 
	
	
	for(int i =1 ;i<= n ;i ++)
	{
		for(int j = 1 ;j <= i ; j++)
		{
			f[i][j] = max(f[i-1][j],f[i-1][j-1]) + a[i][j] ;
		}
	}
	
	
	for(int i =1 ;i<= n ;i ++)
	{
		res = max(res,f[n][i]);
	}
	
	printf("%d",res);
	
	return 0;
}

最长上升子序列:

最长上升子序列 - 洛谷https://www.luogu.com.cn/problem/B3637最长上升子序列也是一个经典的DP问题了,我们还是从闫式DP分析法开始分析。

闫式DP分析法:

 算法分析:

对于 f[i]我们将其分为0 ~ i-1类,对于a[0] ~a[i-1](0 <= j <= i-1),当存在a[j] < a[i] 时,说明以j结尾的序列可以接上 i ,进行状态转移。  

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1000010,INF = 1e8;

int n,res;
int a[N],f[N];

int main()
{
	scanf("%d",&n);
	for(int i = 1 ;i <= n ;i ++) cin >> a[i];
	
	for(int i = 1 ;i <= n ;i ++)
	{
		f[i] = 1; 
		for(int j = 1 ;j<= i-1 ;j ++)
		{
			if(a[j] < a[i])
			{
				f[i] = max(f[i],f[j] + 1);	
			} 
		}
		
		res = max(res,f[i]);
	}
	
	
	printf("%d",res);
	
	return 0;
} 

魔族密码: 

魔族密码 - 洛谷https://www.luogu.com.cn/problem/P1481

算法分析:

魔族密码是最长上升子序列的一个变种题目,换汤不换药,在最长上升子序列中我们的一个判断条件是是否在0 ~ i - 1中存在a[j] < a[i],进行状态转移;我们这个题目和最长上升子序列的转移方程一模一样,只不过条件判断变成了0 ~ i - 1中的字符串是否是当前字符串的前缀。

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 2010,INF = 1e8;

int n,f[N],res;

string str[N];

int main()
{
	cin >> n;
	
	for(int i = 1 ; i <= n ;i ++) cin >> str[i];
	
	for(int i = 1 ;i <= n ;i ++)
	{
		f[i] = 1;
		for(int j = 1;j <= i - 1 ; j ++)
		{
			int len = str[j].length();
			if(str[i].substr(0,len) == str[j])
			{
				f[i] = max(f[i],f[j] + 1);
			} 
		}
		res = max(res,f[i]);
	}
	
	cout << res<<endl;
	
	return 0;
}

编辑距离: 

编辑距离 - 洛谷https://www.luogu.com.cn/problem/P2758

算法分析:

根据闫式DP分析法,我们考虑 i , j 选与不选;

当考虑前 i - 1 个字符和前 j 个字符,f[i,j] = min(f[i-1,j])+1

当考虑前 i 个字符和前 j - 1 个字符,f[i,j] = min(f[i,j-1])+1

当考虑前 i 个字符和前 j 个字符,我们需要曲线救国一下,考虑前i - 1 和前j - 1 个字符然后判断第i个字符和第j个字符是否相等,如果相等就不需要操作,如果不相等还需要一次操作。f[i,j] = min(f[i-1,j-1] + (a[i]!=b[j]))

当考虑前 i -1 个字符和前 j - 1个字符的时候,我们发现其实这种情况已经包含在了前(i ,  j - 1) 和(i-1 , j)两种情况内了。

转移方程:

f[i,j] = min(f[i-1,j]+1,f[i,j-1]+1)f[i,j] = min(f[i,j],f[i-1,j-1] + (a[i]!=b[j]))

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 2010;


char a[N],b[N];

int f[N][N],lena,lenb;

int main()
{
	scanf("%s%s",a + 1 , b + 1);
	
	lena = strlen(a + 1);
	lenb = strlen(b + 1);
	
	for(int i = 0; i <= lena;i ++)f[i][0] = i;
	for(int j = 0; j <= lenb;j ++)f[0][j] = j;
	
	for(int i =1; i<= lena; i++)
	{
		for(int j =1; j<= lenb ;j ++)
		{
			f[i][j] = min(f[i-1][j] + 1, f[i][j-1] + 1);
			f[i][j] = min(f[i][j],f[i-1][j-1] + (a[i]!=b[j]));
		}
	}
	
	printf("%d",f[lena][lenb]);
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ModaHub魔搭社区:向量数据库Milvus产品问题(三)

目录 Milvus 的数据落盘逻辑是怎样的&#xff1f; Mishards 推荐的配置是什么&#xff1f; Mishards 支持 RESTful API 吗&#xff1f; 什么是归一化&#xff1f;Milvus 中为什么有时候需要归一化&#xff1f; 为什么欧氏距离和内积在计算向量相似度时的结果不一致&#x…

【Git原理与使用】-- 分支管理

目录 理解分支 创建分支 查看当前分支 创建本地分支 切换分支 合并分支 删除分支 合并冲突 分支管理策略 分支策略 bug 分支 不建议的合并方式 建议的合并方式 第一步 第二步 删除临时分支 理解分支 分支就是科幻电影里面的平行宇宙&#xff0c;当你正在电脑前…

java 全局、局部异常处理详解及result结果封装

1、引入spring-boot-starter-web依赖和new-swagger依赖 <dependency><groupId>com.jjw</groupId><artifactId>new-swagger</artifactId><version>1.0-SNAPSHOT</version> </dependency> <dependency><groupId>or…

Linux系统编程:进程的替换

目录 一. 进程替换的原理 二. 进程替换的方法 2.1 进程替换的相关函数 2.2 进程替换为其它的C/C程序或其它语言编写的程序 三. 自主实现简单地命令行解释器 四. 总结 一. 进程替换的原理 进程替换&#xff0c;就是对进程所执行的代码进行替换&#xff0c;让正在运行的一个…

华为OD机试真题 Python 实现【简单的自动曝光】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、备注五、解题思路六、Python算法源码七、效果展示1、输入2、输出3、说明4、再输入5、输出6、说明 一、题目描述 一个图像有 n 个像素点&#xff0c;存储在一个长度为 n 的数组 img 里&#xff0c;每个像素点的取值范围[0,255]的…

HOT33-排序链表

leetcode原题链接&#xff1a;排序链表 题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出…

html内盒子长宽增加溢出但是外盒子不自动向下延

自动扩展 问题描述 外盒子设置固定px&#xff0c;导致内盒子如图片长宽增加后&#xff0c;溢出但是外盒子不自动扩展&#xff08;向下延申&#xff09; 图片高230时正常 设置250后超出 问题解决 /*height: 660px;*/ /*设死就不能自动扩展&#xff0c;内块块长宽超出&#x…

vuex-persistedstate —— 数据持久化

在之前的篇目当中对于 Vuex 中的相关内容都讲得差不多&#xff0c;但是在项目中去使用vuex&#xff0c;虽然数据状态得到管理了&#xff0c;但数据在每一次都需要去重新加载&#xff0c;那么对于数据的持久化vue是没有给解决的&#xff0c;而是通过第三方的工具去进行数据的持久…

代码随想录算法训练营第17期第4天(5休息) | 24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结点、面试题 02.07. 链表相交、​​​​​​142. 环形链表 II

目录 24. 两两交换链表中的节点 19. 删除链表的倒数第 N 个结点 面试题 02.07. 链表相交 ​​​​​​142. 环形链表 II 这题不是很难&#xff0c;目前除了从【.】变成了【->】之外&#xff0c;python和C也没啥区别 另外就是对虚拟头结点的掌握了 /*** Definition for …

爬虫小白入门在服务器上-部署爬虫或者开服务接口并供给他人访问

目录 一、准备工作-服务器1、先准备一个服务器&#xff08;以阿里云为例子&#xff09;2、开通服务端口号访问权限 二、准备工作-Xshell登录服务器1、xshell基本登录操作2、xftp基本操作 三、部署代码到服务器上1、部署一个python爬虫脚本在服务器上定时运行等2、部署一个pytho…

Java-API简析_占位符类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131504916 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

区块链开发:JS/TS本地|项目环境搭建

区块链开发&#xff1a;JS/TS本地|项目环境搭建 本地环境搭建VSCode Solidity扩展全局安装Solc,corepackVSCode配置本地Solc安装Ganache搭建JS虚拟环境 项目测试安装依赖编写代码部署合约test_blockchain.ts 设置Script部署查看 报错说明1. Error&#xff1a;missing revert da…

【EasyX】使用C/C++实现 流星雨效果(配上详细注释解释)

&#x1f38a;专栏【​​​​​​​EasyX】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Love Story】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;效果&#x…

RNN LSTM

参考资料&#xff1a; 《机器学习2022》李宏毅史上最详细循环神经网络讲解&#xff08;RNN/LSTM/GRU&#xff09; - 知乎 (zhihu.com) LSTM如何来避免梯度弥散和梯度爆炸&#xff1f; - 知乎 (zhihu.com) 1 RNN 的结构 首先考虑这样一个 slot filling 问题&#xff1a; 注意…

云解析DNS

云解析过程&#xff1a; DNS查询的结果通常会在本地域名服务器中进行缓存&#xff0c;如果本地域名服务器中有缓存的情况下&#xff0c;则会跳过如下DNS查询步骤&#xff0c;很快返回解析结果。下面的示例则概述了本地域名服务器没有缓存的情况下&#xff0c;DNS查询所需的8个步…

电路的组成和连接方式-通路、开路、短路

电路是电子设备中最基本的组成部分之一&#xff0c;它由各种电子元件组成&#xff0c;并通过连接方式构建成不同的电路结构。在电路设计和维护中&#xff0c;通路、开路和短路是常见的概念&#xff0c;它们分别代表了电路中不同的连接状态和故障情况。 工具认识&#xff1a; …

万能的微信小程序个人主页:商城系统个人主页、外卖系统个人主页、购票系统个人主页等等【全部源代码分享+页面效果展示+直接复制粘贴编译即可】

前言 以下给出来四个常见的小程序个人主页,分别是商城系统个人主页,外卖系统个人主页,挂号系统个人主页,电影购票系统个人主页。包括完整的页面布局代码,完整的样式代码。使用的时候,只需要将页面代码和样式代码复制到自己项目对应的页面即可。而且可以根据已有代码只需稍…

【机器学习】准确率、精确度、召回率和 F1 定义

一、说明 数据科学家选择目标变量后 - 例如他们希望预测电子表格中的“列”&#xff0c;并完成了转换数据和构建模型的先决条件&#xff0c;最后步骤之一是评估模型的性能。 二、混淆矩阵的模型 2.1 混淆矩阵 选择性能指标通常取决于要解决的业务问题。假设您的数据集中有 10…

电子时钟制作(瑞萨RA)(2)----使用串口进行程序烧写

概述 本篇文章主要介绍如何使用UART串口烧写程序到瑞萨芯片&#xff0c;并以实际项目进行演示。 硬件准备 首先需要准备一个开发板&#xff0c;这里我准备的是芯片型号R7FA2E1A72DFL的开发板&#xff1a; 视频教程 https://www.bilibili.com/video/BV1kX4y1v7tL/ 电子时钟制…

Symbol.for()

示例&#xff1a;Symbol() 和 Symbol.for(‘ ’)的区别 Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中&#xff0c;键为 "foo" Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbolSymbol.for("b…