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

目录

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.mzph.cn/news/806007.shtml

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

相关文章

【R基础】一组数据计算均值、方差与标准差方法及意义

【R基础】一组数据计算均值、方差与标准差方法及意义 均值、方差与标准差是用来描述数据分布情况 均值&#xff1a;用来衡量一组数据整体情况。 数据离散程度度量标准&#xff1a; 方差&#xff08;均方&#xff0c;s^2&#xff0c;总体参数&#xff0c;离均差平方和&#…

AI大模型原理科普(深度好文)

目录 认识AI大模型家族 AI是什么&#xff1f; 机器学习是什么&#xff1f; 机器学习有哪些分支&#xff1f; 什么是强化学习&#xff1f; 深度学习属于哪一类学习&#xff1f; 生成式AI和深度学习是什么关系&#xff1f; 大语言模型是什么&#xff1f; 所有大语言模型…

【Java】HashMap 源码阅读

HashMap 源码阅读 HashMap 简介 HashMap 主要用来存放键值对&#xff0c;实现了基于哈希表的 Map 接口&#xff0c;非线程安全。 HashMap 可以存放 null 的 key 和 null 值&#xff0c;但 null 作为 key 只能有一个&#xff0c;null 作为 value 可以有多个。 HashMap 有两个…

靡语IT:Bootstrap 简介

1.1 Bootstrap 简介&#xff1a;什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap是前端开发中比较受欢迎的框架&#xff0c;简洁且灵活。它基于HTML、CSS和JavaScript&#xff0c;HTML定义页面元素&#xff0c;CSS定义页面布局&…

BFS广度优先搜索

import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入您…

业务逻辑漏洞(靶场) fiddler

目录 fiddler简介&#xff1a; 业务逻辑漏洞&#xff1a; fiddler下载 靶场&#xff1a; 实验一 ​编辑实验二&#xff08;ps 更改实验url会变&#xff0c;fiddler没抓到东西看看代理改没改&#xff09; 实验三 实验四 fiddler简介&#xff1a; 一款网络抓包工具&#…

内部类、泛型、常用API

内部类 内部类是类中的五大成分之一&#xff08;成员变量、方法、构造器、代码块、内部类&#xff09; 如果一个类定义在另一个类的内部&#xff0c;这个类就是内部类。 场景&#xff1a;当一个类的内部&#xff0c;包含了一个完整的事物&#xff0c;且这个事物没有必要单独设…

20240403-算法复习打卡day43||● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II class Solution { public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001, 0);int sum 0;for (int i 0; i < stones.size(); i) sum stones[i];int target sum / 2;for (int i 0; i < stones.siz…

智慧城市中的物联网革命——青创智通

工业物联网解决方案-工业IOT-青创智通 得益于物联网 (IoT)的变革力量&#xff0c;智慧城市的概念正在迅速成为现实。物联网正在从根本上改变城市的运作方式&#xff0c;为城市居民带来更高的效率、可持续性和生活质量。在本文中&#xff0c;我们将探讨物联网在智慧城市中的作用…

49 样式迁移【李沐动手学深度学习v2课程笔记】

1. 样式迁移&#xff08;Style Transfer) 计算机视觉的应用之一&#xff0c;将样式图片中的样式&#xff08;比如油画风格等&#xff09;迁移到内容图片&#xff08;比如实拍的图片&#xff09;上&#xff0c;得到合成图片 可以理解成为一个滤镜&#xff0c;但相对于滤镜来讲…

SAP ABAP CDS-02 ABAP CDS语法

ABAP CDS中的CDS DDL和CDS DCL的语法包括一般SQL DDL和DCL的元素&#xff0c;还可以定义注释和CDS关联。其语法和语义基本符合CDS的一般概念。 ABAP CDS - 一般语法规则&#xff08;General Syntax Rules&#xff09; 在ABAP CDS中定义CDS对象的CDS DDL和CDS DCL的一般语法规…

基于SSM框架JAVA仓库管理系统源代码Mysql数据库(可当毕设,实训项目,设计大赛)

仓库管理系统实现的功能包括店铺管理&#xff0c;员工管理&#xff0c;部门管理&#xff0c;商品管理&#xff0c;权限管理&#xff0c;入库管理&#xff0c;出库管理&#xff0c;盘点管理&#xff0c;统计管理等功能。该项目采用了Mysql数据库&#xff0c;Java语言&#xff0c…

Hibernate多事务同时调用update(T t) ,字段被覆盖问题

前言 今天现网有个订单卡单了&#xff0c;经过排查发现没有任何异常日志&#xff0c;根据日志定位发现本应该更新的一个状态&#xff0c;也sql肯定执行了(使用了Hibernate的ORM框架)&#xff0c;但是数据库里面的状态没有更新。大概逻辑如下 String hql from orderInfo where…

大模型训练:如何解决GPU万卡互联挑战?

如何解决GPU万卡互联的挑战 近日&#xff0c;字节跳动携手北京大学研究团队发布重磅论文&#xff0c;揭示了一项革命性技术&#xff1a;将大型语言模型训练扩展至超10,000块GPU的生产系统。此系统不仅解决了万卡集群训练大模型时的效率和稳定性难题&#xff0c;更标志着人工智能…

用dbms_shared_pool.purge清除执行计划

1.Oracle 11g如何清除share pool中某条SQL的执行计划 以前在Oracle 10g数据库上,如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法&#xff08;总不能alter system flush shared_pool&#xff09;,只能…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索&#xff1a; 2. 通俗易懂的回答

【Gem5】获取构建教程

gem5-tutorial-hpca-2023 1 介绍 1.1 Gem5是什么1.2 Gem5可以用来做什么1.3 获取并构建gem5 gem5-tutorial-hpca-2023 打开网址&#xff1a; github 创建教程代码空空间 “Code” -> “Codespaces” -> “Create Codespace on master” GitHub Codespaces 是一个由…

LeetCode 157. Read N Characters Given Read4

个人专栏 🤺 leetcode 🧗 Leetcode Prime 🏇 Golang20天教程 🚴‍♂️ Java问题收集园地 🌴 成长感悟 欢迎大家观看,不执着于追求顶峰,只享受探索过程 LeetCode 157. 读取给定的 N 个字符 Read4 一、题目描述 Given a file and assume that you can only read th…

配置Kubectl命令自动补全功能

网站&#xff1a; bash-completion补全工具官网&#xff1a;https://caliban.org/bash/ 安装: 在日常管理k8s集群的时候&#xff0c;时刻都会使用到Kubectl命令行工具&#xff0c;但是该命令还是挺复杂的&#xff0c;使用中也记不住那么多的api选项&#xff0c;所以这里介绍…

python如何判断点是否在旋转矩形内部矢量

1. 简介 在计算机图形学和计算几何中&#xff0c;经常会遇到判断一个点是否在一个旋转矩形内部的问题。本项目方案旨在使用Python提供一种高效准确的算法来解决这个问题。 2. 算法原理 方法一&#xff1a; 为了判断一个点是否在一个旋转矩形内部&#xff0c;我们可以将问题…