PTA-2023年软件设计综合实践_9(动态规划法)

7-1 数塔

数塔如图所示,若每一步只能走到相邻的结点(图中有数字的方格),则从最顶层走到最底层所经过的所有结点的数字之和最大是多少?测试数据保证结果不大于231−1。

数塔1.png

 C++

#include <bits/stdc++.h>
using namespace std;int main(){int n;cin>>n;while(n--){int a[101][101]={0};int dp[101][101]={0};int high;//最高层号cin>>high;for(int i=1;i<=high;i++){for(int j=1;j<=i;j++){cin>>a[i][j];if(i==high){dp[i][j]=a[i][j];//递推边界}}}for(int i=high-1;i>=1;i--){for(int j=1;j<=i;j++){dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];}}cout<<dp[1][1]<<endl;}  
}

7-2 最大子列和问题

给定K个整数组成的序列{ N1​, N2​, ..., NK​ },“连续子列”被定义为{ Ni​, Ni+1​, ..., Nj​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:与样例等价,测试基本正确性;
  • 数据2:102个随机整数;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;

输入格式:

#include<iostream>
using namespace std;int main() {int K, sum = 0;int number[100000];cin >> K;for (int i = 0; i < K; i++) {cin >> number[i];}for (int i = 0; i < K; i++) {int temp = 0;for (int j = i; j < K; j++) {temp += number[j];if (temp > sum) {sum = temp;}}}cout << sum;return 0;
}

7-3 最长公共子序列

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

#include <iostream>
using namespace std;
const int N = 1010;
int n, m;
char a[N], b[N];
int f[N][N];
int main() {cin >> n >> m >> a + 1 >> b + 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (a[i] == b[j]) {//找到一个公共字符,故长度加1f[i][j] = f[i - 1][j - 1] + 1;} else {//没找到则找到临近最大的一个长度,表示最大长度还没有变化//【为什么只需要找临近呢?因为dp数组中抽象地保存之前的状态,所以已经包含前面比较短的情况,再者,因为保存之前的状态,现在遍历到的这个位置,临近的元素就是之前状态的长度,因为我现在需要长度不变,所以在临近找一个最大的即可。】f[i][j] = max(f[i - 1][j], f[i][j - 1]);}}}cout << f[n][m] << '\n';return 0;
}

7-4 jmu-ds-最长公共子串

给出2个字符串,输出2字符串的最长公共子串。

输入格式:

输入2个字符串,不可包含空格。

输出格式:

输出2个字符串的最长公共子串。若没有公共子串,则输出“NULL”

python

a = input()
b = input()
def maxSubstring(a,b):if a==None or b==None:#空值返回return None#接下来获取两者较长和较短的字符串if len(a)>len(b):M=am=belse:M=bm=a#遍历遍历较短的字符串,并依次减少短字符串的字符数量,#判断长字符是否包含该子串i=0while i<len(m):begin=0end=len(m)-i#先扣住end部分的字符,然后一个循环看begin从0~end是否有符合的最大串while end<=len(m):current=m[begin:end]if current in M:return currentbegin+=1end+=1i+=1return 'NULL'
print(maxSubstring(a,b))

7-5 最长有序子序列

对于给定一个数字序列 (a1​,a2​,…,an​) ,如果满足a1​<a2​<…<an​,则称该序列是有序的。若在序列(a1​,a2​,…,an​) 中删除若干元素得到的子序列是有序的,则称该子序列为一个有序子序列。有序子序列中长度最大的即为最长有序子序列。

例如,(1,3,5)、(3,5,8)、(1,3,5,9)等都是序列 (1,7,3,5,9,4,8) 的有序子序列;而(1,3,5,9)、(1,3,5,8)、(1,3,4,8)都是序列 (1,7,3,5,9,4,8)的一个最长有序子序列,长度为4。

请编写程序,求出给定数字序列中的最长有序子序列的长度。

python

def longest_ordered_subsequence(nums):# 获取数字序列的长度n = len(nums)# 创建一个数组来保存以每个元素结尾的最长有序子序列的长度dp = [1] * n# 计算最长有序子序列的长度for i in range(1, n):for j in range(i):if nums[i] > nums[j]:dp[i] = max(dp[i], dp[j] + 1)# 返回最长有序子序列的最大长度return max(dp)# 读取输入数据的数量
T = int(input())for _ in range(T):# 读取数字序列的长度和元素n = int(input())sequence = list(map(int, input().split()))# 计算并输出最长有序子序列的长度result = longest_ordered_subsequence(sequence)print(result)# 输出空行(除了最后一组测试数据)if _ != T - 1:print()

7-6 跳房子

跳房子是小朋友玩的游戏。地面上画出一连串格子,每个格子里有一个整数,小朋友从外面跳入格子,并继续往前跳,直到跳出所有格子。每次跳跃的规则是,可以跳入下一格或下下格或下下下格。怎么跳能让落脚格子里的数的累加和最小。

python3

n = int(input())  # 读入格子数  
nums = list(map(int, input().split()))  # 读入每个格子里的数
nums=nums+[0]dp = [100000] * (n + 2)  # 初始化dp数组
dp[0] = 0   
dp[1] = nums[0]for i in range(2, n + 2 ):  dp[i] = min(dp[i - 1] + nums[i-1], dp[i - 2] + nums[i-1], dp[i - 3] + nums[i-1])  # 计算当前格子的最小累加和  print(dp[n+1])  # 输出结果

7-7 寻宝路线

在一个m行n列方格矩阵中,每一个方格内摆放着价值不等的宝贝(价值可正可负),让小明感到好奇的是,从左上角到达右下角的所有可能路线中,能捡到宝贝的价值总和最大是多少?而且这种达到最大值的路线
又有多少条?【注意:只能从一个格子向下或向右走到相邻格子,并且走到的格子宝贝一定会被捡起。】

c++

#include <iostream>
#include <vector>using namespace std;int main() {int m, n;cin >> m >> n;vector<vector<int>> grid(m, vector<int>(n, 0));// 读取宝贝价值矩阵for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {cin >> grid[i][j];}}// 创建动态规划所需的二维数组vector<vector<int>> dp(m, vector<int>(n, 0));vector<vector<int>> ways(m, vector<int>(n, 0));dp[0][0] = grid[0][0];ways[0][0] = 1;// 初始化第一列和第一行for (int i = 1; i < m; ++i) {dp[i][0] = dp[i - 1][0] + grid[i][0];ways[i][0] = 1;}for (int j = 1; j < n; ++j) {dp[0][j] = dp[0][j - 1] + grid[0][j];ways[0][j] = 1;}// 计算其余位置的最大值和路径数量for (int i = 1; i < m; ++i) {for (int j = 1; j < n; ++j) {if (dp[i - 1][j] > dp[i][j - 1]) {dp[i][j] = dp[i - 1][j] + grid[i][j];ways[i][j] = ways[i - 1][j];} else if (dp[i - 1][j] < dp[i][j - 1]) {dp[i][j] = dp[i][j - 1] + grid[i][j];ways[i][j] = ways[i][j - 1];} else {dp[i][j] = dp[i - 1][j] + grid[i][j];ways[i][j] = ways[i - 1][j] + ways[i][j - 1];}}}int max_value = dp[m - 1][n - 1];int max_ways = ways[m - 1][n - 1];cout << max_value << " " << max_ways << endl;return 0;
}

7-8 硬币找零

用 n 种不同币值的硬币凑出 m 元,最少需要多少硬币。

输入格式:

第一行输入需要凑的钱数 m 和硬币的种类 n (0<m<100,0<n<10),第二行输入 n 种硬币的具体币值,假设硬币供应量无限多。

输出格式:

输出最少需要的硬币个数

输入样例:

在这里给出一组输入。例如:

PYTHON3

def min_coins(coins, m):dp = [float('inf')] * (m + 1)dp[0] = 0for i in range(1, m + 1):for coin in coins:if i >= coin:dp[i] = min(dp[i], dp[i - coin] + 1)return dp[m] if dp[m] != float('inf') else -1if __name__ == "__main__":m, n = map(int, input().split())coins = list(map(int, input().split()))result = min_coins(coins, m)print(result)

7-9 至多删三个字符

给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?

C++

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int dp[N][4];signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);string s, stemp;cin >> stemp;s.assign("0");s.append(stemp);dp[0][0] = 1;for (int i = 1; i < s.size(); ++i){for (int j = 0; j <= 3; ++j){dp[i][j] = dp[i - 1][j];if (j)dp[i][j] = dp[i][j] + dp[i - 1][j - 1];for (int k = i - 1; k >= 1 && i - k <= j; --k){if (s[k] == s[i]){dp[i][j] = dp[i][j] - dp[k - 1][j - (i - k)];break;}}}}int ans = 0;for (int i = 0; i <= 3; ++i){ans = ans + dp[s.size() - 1][i];}cout << ans << endl;return 0;
}

7-10 拼题A打卡奖励

拼题 A 的教超搞打卡活动,指定了 N 张打卡卷,第 i 张打卡卷需要 mi​ 分钟做完,完成后可获得 ci​ 枚奖励的金币。活动规定每张打卡卷最多只能做一次,并且不允许提前交卷。活动总时长为 M 分钟。请你算出最多可以赢得多少枚金币?

输入格式:

输入首先在第一行中给出两个正整数 N(≤103) 和 M(≤365×24×60),分别对应打卡卷的数量和以“分钟”为单位的活动总时长(不超过一年)。随后一行给出 N 张打卡卷要花费的时间 mi​(≤600),最后一行给出 N 张打卡卷对应的奖励金币数量 ci​(≤30)。上述均为正整数,一行内的数字以空格分隔。

C++

#include<bits/stdc++.h>
using namespace std;
const int N=1004;
const int INF=0x3f3f3f3f;
int n,m;
int w[N],v[N];
//int f[N][10000];
int dp[N][30005];//前i个物品中得到价值为j时候的最小花费 //ans为dp[n][j]<m时最大的j 
int mv=0;int main()
{
//	cout<<365*60*24;cin>>n>>m;for(int i=1;i<=n;++i)cin>>w[i];for(int i=1;i<=n;++i){cin>>v[i];mv+=v[i];}// 01背包写法,空间不够,而且也会超时,因为“花费”这一维度规模比较大,而递推时需要一一枚举
//		for(int i=1;i<=n;++i)
//		for(int j=0;j<=m;++j)
//		{
//			if(j>=w[i])
//			f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
//			else f[i][j]=f[i-1][j];
//		}//下面是另一种思路,第二维换成价值//初始化 for(int i=0;i<=n;++i){for(int j=0;j<=mv;++j){dp[i][j]=INF; }}dp[0][0]=0;//递归过程:分为取第i个和不取第i个for(int i=1;i<=n;++i){for(int j=0;j<=mv;++j){if(j>=v[i])//注意边界dp[i][j]=min(dp[i-1][j-v[i]]+w[i],dp[i-1][j]);else dp[i][j]=dp[i-1][j];}}//可以改进递推过程:由于递归方程中两个来源都是上一个i的,去掉第一个维度,节省空间,注意这时候j要从大到小迭代,才能保证递推过程中的dp[j-v[i]]是来源于i-1而不是i
// 		for(int i=1;i<=n;++i)
// 		{
// 			for(int j=mv;j>=0;--j)
// 			{
// 				if(j>v[i])
// 				dp[j]=min(dp[j-v[i]]+w[i],dp[j]);
// 				else 
// 				dp[j]=dp[j];
// 		}//取答案:最小花费在给定的m内的最大价值for(int j=mv;j>=0;j--){if(dp[n][j]<=m){cout<<j;break;}}//	cout<<f[n][m];return 0;
}

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

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

相关文章

IDEA插件:Apipost Helper使用

Apipost-Helper是由Apipost推出的IDEA插件&#xff0c;写完接口可以进行快速调试&#xff0c;且支持搜索接口、根据method跳转接口&#xff0c;还支持生成标准的API文档&#xff0c;注意&#xff1a;这些操作都可以在代码编辑器内独立完成&#xff0c;非常好用&#xff01;这里…

YOLOv8改进 | 2023 | DWRSeg扩张式残差助力小目标检测 (附修改后的C2f+Bottleneck)

论文地址&#xff1a;官方论文地址 代码地址&#xff1a;该代码目前还未开源&#xff0c;我根据论文内容进行了复现内容在文章末尾。 一、本文介绍 本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv8中的C2f和Bottleneck模块&#xff0c;主要针对的是小目标检测&#xff0c…

【GraphQL】什么是Prisma?

本页提供了Prisma及其工作原理的高级概述。 什么是Prisma&#xff1f; Prisma是一个开源的下一代ORM。它由以下部分组成&#xff1a; Prisma客户端&#xff1a;Node.js和TypeScript的自动生成和类型安全查询生成器Prisma迁移&#xff1a;迁移系统Prisma Studio:GUI&#xff0…

JVM——内存溢出和内存泄漏

目录 1. 内存溢出和内存泄漏内存泄漏的常见场景解决内存溢出的思路1.发现问题 – Top命令2.发现问题 – VisualVM3.发现问题 – Arthas4.发现问题 – Prometheus Grafana5.发现问题 – 堆内存状况的对比![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/058d113715b…

BIO、NIO、selector、Netty代码Demo示例

文章目录 &#xff08;一&#xff09;BIO&#xff08;Blocking I/O 阻塞I/O&#xff09;&#xff08;二&#xff09;NIO&#xff08;Non-Blocking I/O 非阻塞I/O&#xff09;&#xff08;三&#xff09;IO多路复用--Selector&#xff08;四&#xff09;Netty &#xff08;一&am…

【hacker送书第5期】SQL Server从入门到精通(第5版)

第5期图书推荐 内容简介作者简介图书目录参与方式 内容简介 SQL Server从入门到精通&#xff08;第5版&#xff09;》从初学者角度出发&#xff0c;通过通俗易懂的语言、丰富多彩的实例&#xff0c;详细介绍了SQL Server开发所必需的各方面技术。全书分为4篇共19章&#xff0c;…

优化机器学习:解析数据归一化的重要性与应用

在机器学习中&#xff0c;数据归一化是一种数据预处理的技术&#xff0c;旨在将数据转换为相似的范围或标准化的分布。这样做的主要目的是消除不同特征之间的量纲差异或数值范围差异&#xff0c;以确保模型在训练时更稳定、更有效地学习特征之间的关系。 通常&#xff0c;机器…

智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水循环算法4.实验参数设定5.算法结果6.参考文献7.…

安卓apk抓包

起因 手机&#xff08;模拟器&#xff09;有时候抓不到apk的包&#xff0c;需要借助Postern设置一个代理&#xff0c;把模拟器的流量代理到物理机的burp上。 解决方案 使用Postern代理&#xff0c;把apk的流量代理到burp。 Postern是一个用于代理和网络流量路由的工具&#xf…

C++ day44完全背包问题 零钱兑换Ⅱ 组合总和Ⅳ

完全背包&#xff1a;一个物品可以使用无数次&#xff0c;将01背包中倒序遍历背包变成正序遍历背包 遍历顺序&#xff1a;在完全背包中&#xff0c;对于一维dp数组来说&#xff0c;其实两个for循环嵌套顺序是无所谓的&#xff01; 先遍历物品&#xff0c;后遍历背包可以&#…

win10 下 mvn install 报错:编码GBK不可映射字符

问题背景 由于jenkins需要部署不同的项目&#xff0c;需要使用不同的jdk版本&#xff0c;所以需要配置单独的settings.xml&#xff0c;使用指定的jdk版本进行编译&#xff0c;这里需要单独的maven设置&#xff0c;在配置完后进行mvn的install的时候&#xff0c;由于存在中文注释…

Maven——Maven使用基础

1、安装目录分析 1.1、环境变量MAVEN_HOME 环境变量指向Maven的安装目录&#xff0c;如下图所示&#xff1a; 下面看一下该目录的结构和内容&#xff1a; bin&#xff1a;该目录包含了mvn运行的脚本&#xff0c;这些脚本用来配置Java命令&#xff0c;准备好classpath和相关…

Cytoscape软件下载、安装、插件学习[基础教程]

写在前面 今天分享的内容是自己遇到问题后&#xff0c;咨询社群里面的同学&#xff0c;帮忙解决的总结。 关于Cytoscape&#xff0c;对于做组学或生物信息学的同学基本是陌生的&#xff0c;可能有的同学用这个软件作图是非常溜的&#xff0c;做出来的网络图也是十分的好看&am…

【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

距离“全自动”漏洞挖掘又近了一步!腾讯安全大数据实验室论文入选ACM CCS 2023

计算机领域国际权威学术顶会ACM CCS 2023于11月26日在丹麦哥本哈根开幕。腾讯安全大数据实验室团队论文《Hopper: Interpretative Fuzzing for Libraries》被大会收录&#xff0c;昨天&#xff0c;实验室研究员谢雨轩受邀出席大会进行主题分享。 该论文提出了解释性模糊测试&a…

UCSC基因组浏览器用法

UCSC基因组浏览器用法 UCSC基因组浏览器是一个强大的在线工具&#xff0c;主要用于查看和分析多种生物的基因组数据。这个浏览器最初是由加利福尼亚大学圣克鲁兹分校的生物信息学家和计算生物学家开发的&#xff0c;旨在为科研人员提供一个易于访问和使用的界面&#xff0c;用于…

Java数据结构之《合并线性表》问题

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等偏下的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我…

freertos任务调度机制深度分析(以RISC-V架构为例)

1、前言 本文是以RISC-V架构为例进行讲解&#xff0c;在汇编代码层面和ARM架构不一样&#xff0c;但是整体框架是一样的侧重任务调度底层机制讲解&#xff0c;讲解代码只保留了基本功能&#xff0c;可配置的功能基本都已经删除本文是以可抢占式调度机制进行讲解RISC-V架构只支持…

【ZEDSLAM】Ubuntu18.04系统ZED 2i双目相机SDK安装、联合标定、SLAM测试

0.设备、环境和说明 笔记本电脑i5-8300H、GTX 1060、32GRAM 因为后面要测试Vins-Fusion和ORB-SLAM3&#xff0c;所以推荐安装Ubuntu 18.04&#xff08;或者Ubuntu 20.04&#xff09; ROS 1&#xff08;不建议用比Ubuntu18更低的版本&#xff09; ROS一键安装命令&#xff1a;…

智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…