【动态规划-线性dp】【蓝桥杯备考训练】:乌龟棋、最长上升子序列、最长公共子序列、松散子序列、最大上升子序列和【已更新完成】

news2024/12/25 9:44:02

目录

1、乌龟棋

2、最长上升子序列

3、最长公共子序列

4、松散子序列

5、最大上升子序列和


1、乌龟棋

小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。

乌龟棋的棋盘只有一行,该行有 N 个格子,每个格子上一个分数(非负整数)。

棋盘第 1 格是唯一的起点,第 N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。

乌龟棋中共有 M 张爬行卡片,分成 4 种不同的类型(M 张卡片中不一定包含所有 4 种类型的卡片),每种类型的卡片上分别标有 1、2、3、4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。

游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。

游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。

玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。

很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。

现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?

输入格式

输入文件的每行中两个数之间用一个空格隔开。

第 1 行 2 个正整数 N 和 M,分别表示棋盘格子数和爬行卡片数。

第 2 行 N 个非负整数,a1,a2,……,aN其中 ai表示棋盘第 i 个格子上的分数。

第 3 行 M 个整数,b1,b2,……,bM表示 M 张爬行卡片上的数字。

输入数据保证到达终点时刚好用光 M 张爬行卡片。

输出格式

输出只有 1 行,包含 1 个整数,表示小明最多能得到的分数。

数据范围

1≤N≤350
1≤M≤120
0≤ai≤100
1≤bi≤4
每种爬行卡片的张数不会超过 40。

输入样例:
9 5
6 10 14 2 8 8 18 5 17
1 3 1 2 1
输出样例:
73
思路:

用四个维度表示四个卡片的消耗量,状态转移方程:

auto &v=f[b1][b2][b3][b4];可以减少代码量

					int t=a[b1+2*b2+3*b3+4*b4+1];
					
					auto &v=f[b1][b2][b3][b4];
					
					if(b1)v=max(v,f[b1-1][b2][b3][b4]+t);
					
					if(b2)v=max(v,f[b1][b2-1][b3][b4]+t);
					
					if(b3)v=max(v,f[b1][b2][b3-1][b4]+t);
					
					if(b4)v=max(v,f[b1][b2][b3][b4-1]+t);
代码:
#include<bits/stdc++.h>

using namespace std;

const int N=41;

int a[360];

int b[5];

int n,m;

int f[N][N][N][N];

int main()
{
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	
	for(int i=1;i<=m;i++)
	{
		int t;
		scanf("%d",&t);
		
		b[t]++;
		//cout<<b[t];
	}

	for(int b1=0;b1<=b[1];b1++)
		for(int b2=0;b2<=b[2];b2++)
			for(int b3=0;b3<=b[3];b3++)
				for(int b4=0;b4<=b[4];b4++)
				{
					f[b1][b2][b3][b4]=a[b1+2*b2+3*b3+4*b4+1];
				}


    
	for(int b1=0;b1<=b[1];b1++)
		for(int b2=0;b2<=b[2];b2++)
			for(int b3=0;b3<=b[3];b3++)
				for(int b4=0;b4<=b[4];b4++)
				{
					int t=a[b1+2*b2+3*b3+4*b4+1];
					
					auto &v=f[b1][b2][b3][b4];
					
					if(b1)v=max(v,f[b1-1][b2][b3][b4]+t);
					
					if(b2)v=max(v,f[b1][b2-1][b3][b4]+t);
					
					if(b3)v=max(v,f[b1][b2][b3-1][b4]+t);
					
					if(b4)v=max(v,f[b1][b2][b3][b4-1]+t);
				}
				
	cout<<f[b[1]][b[2]][b[3]][b[4]];
	return 0;
}

2、最长上升子序列

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式

第一行包含整数 N。

第二行包含 N个整数,表示完整序列。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N≤1000,
−1e9≤数列中的数≤109

输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
思路:

状态转移方程:

			if(a[j]<a[i])f[i]=max(f[i],f[j]+1);
			res=max(res,f[i]);
代码:
#include<bits/stdc++.h>

using namespace std;

const int N=1003;

int a[N];

int n;

int f[N];//以i结尾的最长子序列数 

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

3、最长公共子序列

给定两个长度分别为 N和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。

输入格式

第一行包含两个整数 N 和 M。

第二行包含一个长度为 N 的字符串,表示字符串 A。

第三行包含一个长度为 M 的字符串,表示字符串 B。

字符串均由小写字母构成。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N,M≤1000

输入样例:
4 5
acbd
abedc
输出样例:
3
思路:
状态转移方程:
f[i][j]=max(f[i-1][j],f[i][j-1]);//这两个都算过了 
			if(a[i]==b[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1);
			res=max(res,f[i][j]);
代码:
#include<bits/stdc++.h>

using namespace std;

int n,m;

const int N=1003;

char a[N],b[N];

int f[N][N]; 

int main()
{
	cin>>n>>m;
	
	int res=-1;
	
	for(int i=1;i<=n;i++)cin>>a[i];
	
	for(int i=1;i<=m;i++)cin>>b[i];
	//for(int i=1;i<=m;i++)cout<<b[i];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			f[i][j]=max(f[i-1][j],f[i][j-1]);//这两个都算过了 
			if(a[i]==b[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1);
			res=max(res,f[i][j]);
		}
	cout<<res;
	return 0; 
}

4、松散子序列

给定一个仅含小写字母的字符串 s,假设 s 的一个子序列 t 的第 i 个字符对应了原字符串中的第 pi 个字符。

我们定义 s 的一个松散子序列为:对于 i>1 总是有 pi − pi−1≥2。

设一个子序列的价值为其包含的每个字符的价值之和(a∼z 分别为 1∼26)。

求 s 的松散子序列中的最大价值。

输入格式

输入一行包含一个字符串 s。

输出格式

输出一行包含一个整数表示答案。

数据范围

对于 20% 的评测用例,|s|≤10;
对于 40% 的评测用例,|s|≤300;
对于 70% 的评测用例,|s|≤5000;
对于所有评测用例,1≤|s|≤1e6,字符串中仅包含小写字母。

输入样例:
azaazaz
输出样例:
78
思路:

状态转移方程:

		f[i]=max(f[i],f[i-1]);
		if(i-2>=0)f[i]=max(f[i],f[i-2]+(a[i]-'a'+1));
代码:
#include<bits/stdc++.h>

using namespace std;

const int N=1e6+10;

char a[N];

int f[N];

int main()
{
	scanf("%s",a+1);//从1索引开始读取
	
	int n=strlen(a+1);
	
	for(int i=1;i<=n;i++)
	{
	    //cout<<a[i]<<" ";
		f[i]=a[i]-'a'+1;
	}
	
	//int res=-1;
	
	for(int i=1;i<=n;i++)
	{

		f[i]=max(f[i],f[i-1]);
		if(i-2>=0)f[i]=max(f[i],f[i-2]+(a[i]-'a'+1));
		//cout<<f[i]<<endl;
		//res=max(res,f[i]);还可以再优化!
		
	} 
	
	cout<<f[n];
	return 0;
}

5、最大上升子序列和

一个数的序列 bi,当 b1<b2<…<bS 的时候,我们称这个序列是上升的。

对于给定的一个序列(a1,a2,…,aN),我们可以得到一些上升的子序列(ai1,ai2,…,aiK),这里1≤i1<i2<…<iK≤N。

比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。

这些子序列中和最大为18,为子序列(1,3,5,9)的和。

你的任务,就是对于给定的序列,求出最大上升子序列和。

注意,最长的上升子序列的和不一定是最大的,比如序列(100,1,2,3)的最大上升子序列和为100,而最长上升子序列为(1,2,3)。

输入格式

输入的第一行是序列的长度N。

第二行给出序列中的N个整数,这些整数的取值范围都在0到10000(可能重复)。

输出格式

输出一个整数,表示最大上升子序列和。

数据范围

1≤N≤1000

输入样例:
7
1 7 3 5 9 4 8
输出样例:
18
思路:

状态转移方程:

			if(a[i]>a[j])f[i]=max(f[i],f[j]+a[i]);
代码:
#include<bits/stdc++.h>

using namespace std;

const int N=1003;

int a[N];

int f[N]; 


int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		f[i]=a[i];
	}
	int res=-1;
	for(int i=1;i<=n;i++)
		for(int j=0;j<i;j++)
		{
			//f[i]=max(f[i],f[j]);错误的,虽然j比i小,a[j]不一定比a[i]小
			if(a[i]>a[j])f[i]=max(f[i],f[j]+a[i]);
			//cout<<f[i]<<" ";
			res=max(res,f[i]);
		}
	cout<<res;
	return 0;
}

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

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

相关文章

植物大战僵尸Python版,附带源码注解

目录 一、实现功能 二、安装环境要求 三、如何开始游戏 四、怎么玩 五、演示 六、部分源码注释 6.1main.py 6.2map.py 6.3Menubar.py 七、自定义 7.1plant.json 7.2zombie.json 一、实现功能 实施植物&#xff1a;向日葵、豌豆射手、壁桃、雪豆射手、樱桃炸弹、三…

笔记-Building Apps with the ABAP RESTful Application Programming Model-Week3

Week3 Unit 1: The Enhanced Business Scenario 本节介绍了将要练习的demo的业务场景,在前两周成果的基础上,也就是只读列表,也可以说是报表APP基础上启用了事务能力,也就是CURD以及自定义业务功能的能力,从创建基本的behavior definition,然后behavior definition proj…

老王讲IT:高级变量类型

IT老王&#xff1a;高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型&#xff08;float&#xff09; 布尔型&#xff08;bool&#xff09; 真 True 非 0 数 —— 非零…

阻抗匹配(低频和高频)

一、当信号为低频时 二、当信号为高频时 三、最理想的阻抗要求&#xff1f; 四、为什么射频阻抗基本都是50欧姆&#xff08;信号源阻抗传输线特征阻抗负载阻抗50欧姆&#xff09; 综合考虑&#xff0c;射频行业标准选定50欧姆阻抗。

【鸿蒙开发】系统组件Text,Span

Text组件 Text显示一段文本 接口&#xff1a; Text(content?: string | Resource) 参数&#xff1a; 参数名 参数类型 必填 参数描述 content string | Resource 否 文本内容。包含子组件Span时不生效&#xff0c;显示Span内容&#xff0c;并且此时text组件的样式不…

算法四十天-删除排序链表中的重复元素

删除排序链表中的重复元素 题目要求 解题思路 一次遍历 由于给定的链表是排好序的&#xff0c;因此重复的元素在链表中的出现的位置是连续的&#xff0c;因此我们只需要对链表进行一次遍历&#xff0c;就可以删除重复的元素。 具体地&#xff0c;我们从指针cur指向链表的头节…

React路由快速入门:Class组件和函数式组件的使用

1. 介绍 在开始学习React路由之前&#xff0c;先了解一下什么是React路由。React Router是一个为React应用程序提供声明式路由的库。它可以帮助您在应用程序中管理不同的URL&#xff0c;并在这些URL上呈现相应的组件。 2. 安装 要在React应用程序中使用React路由&#xff0c;…

【前沿模型解析】潜在扩散模型 2-3 | 手撕感知图像压缩 基础块 自注意力块

1 注意力机制回顾 同ResNet一样&#xff0c;注意力机制应该也是神经网络最重要的一部分了。 想象一下你在观看一场电影&#xff0c;但你的朋友在给你发短信。虽然你正在专心观看电影&#xff0c;但当你听到手机响起时&#xff0c;你会停下来查看短信&#xff0c;然后这时候电…

C++可变模板参数与包装器(function、bind)

文章目录 一、 可变参数模板1. 概念2. 参数包值的获取 二、 包装器1. 什么是包装器2. 为什么要有包装器3. std::function&#xff08;1&#xff09; function概念&#xff08;2&#xff09; 利用function解决实例化多份问题&#xff08;3&#xff09; 包装器的其他使用场景&…

水资源管理系统:守护生命之源,构建和谐水生态

水资源是维系地球生态平衡和人类社会可持续发展的重要基础。然而&#xff0c;随着人口增长、工业化和城市化的加速&#xff0c;水资源短缺、水质污染和生态破坏等问题日益凸显。在这样的背景下&#xff0c;构建一个全面、高效、智能的水资源管理系统显得尤为迫切和必要。 项目…

Google Cookie意见征求底部弹窗

关于欧盟 Cookie 通知 根据2024年欧盟的《通用数据保护条例》以及其他相关法规&#xff0c;要求google cookie的使用必须征求用户的同意&#xff0c;才能进行收集用户数据信息&#xff0c;因此跨境独立站&#xff0c;如果做欧洲市场&#xff0c;就必须弹出cookie收集数据弹窗&a…

阿赵UE学习笔记——26、动画混合空间

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。之前学习了通过蓝图直接控制动画播放&#xff0c;或者通过动画状态机去控制播放。这次来学习一种比较细致的动画控制播放方式&#xff0c;叫做动画混合空间。 一、使用的情景 假设我们现在需…

链表的中间结点——每日一题

题目链接&#xff1a; OJ链接 题目&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&…

2023一个前端人的杂谈

酒香也怕巷子深 年底提车,回河北过年,一路总是旅游的牌子,后来去满城滑雪,随拍了几张照片,才更加感受河北的魅力。 感觉仅仅是这一抹黄昏,就让这一行物超所值了,原来那句宣传语所言非虚:这么近,那么美,周末到河北,然而我认为实际的好处,可能不止如此。 作为一个出…

ADC电路项目1——10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8

分享一个入门SAR ADC的完整电路项目&#xff0c;适合新手小白学习 10bit 20MHz SAR ADC&#xff08;WX:didadidadidida313&#xff0c;加我备注&#xff1a;CSDN 10 bit SAR ADC&#xff0c;谢绝白嫖哈&#xff09; 概述&#xff1a; 本设计采用 smic18mmrf CMOS 工艺&#xf…

23linux 自定义shell文件系统

打印环境变量&#xff0c;把当前子进程所有环境变量打印出来 环境变量也是一张表&#xff08;指针数组以null结尾&#xff0c;最后条件不满足就退出了 &#xff09; 用子进程调用 结论1 当我们进行程序替换的时候 &#xff0c;子进程对应的环境变量&#xff08;子进程的环境变…

2024年3月30日~2024年4月7日周报

文章目录 一、前言二、创意收集2.1 多任务学习2.1.1 多任务学习的定义与优势2.1.2 多任务学习的分类 2.2 边缘检测2.2.1 基础理论2.2.2 sobel代码介绍2.2.3 canny代码介绍 三、《地震速度模型超分辨率的多任务学习》3.1 M-RUDSR架构3.2 详细介绍3.3 实验设置 四、实验五、小结5…

网工内推 | 深信服、宁德时代,最高20K招安全工程师,包吃包住

01 深信服科技 招聘岗位&#xff1a;安全服务工程师 职责描述&#xff1a; 1.负责现场安全服务项目工作内容&#xff0c;包含渗透测试、安全扫描、基线核查、应急响应等&#xff1b; 2.协助用户完成安全测试漏洞整改、复测工作&#xff1b; 3.为用户提供网络、主机、业务系统等…

数据库讲解---(数据查询)【MySQL版本】

零.前言 数据库讲解&#xff08;MySQL版&#xff09;&#xff08;超详细&#xff09;【第一章】-CSDN博客 数据库-ER图教程_e-r图数据库-CSDN博客 数据库讲解&#xff08;MySQL版&#xff09;&#xff08;超详细&#xff09;【第二章】【上】-CSDN博客 数据库讲解---(SQL语…

[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度

一、算法的时间和空间复杂度 文章目录 一、算法的时间和空间复杂度1、时间复杂度2、空间复杂度 二、Transformer的时间复杂度分析1、 self-attention 的时间复杂度2、 多头注意力机制的时间复杂度 三、transformer的空间复杂度 算法是指用来操作数据、解决程序问题的一组方法。…