【动态规划】最长上升子序列(Longest Increasing Subsequence)问题以及输出具体方案

news/2025/1/20 10:35:04/文章来源:https://www.cnblogs.com/Tshaxz/p/18680885

最长上升子序列

两道模板题(一样的)
洛谷 B3637 最长上升子序列
AcWing 895. 最长上升子序列

题目描述

这是一个简单的动规板子题。

给出一个由 \(n(n\le 5000)\) 个不超过 \(10^6\) 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。

最长上升子序列是指,从原序列中按顺序取出一些数字排在一起,这些数字是逐渐增大的。

输入格式

第一行,一个整数 \(n\),表示序列长度。

第二行有 \(n\) 个整数,表示这个序列。

输出格式

一个整数表示答案。

样例 #1

样例输入 #1

6
1 2 4 1 3 4

样例输出 #1

4

提示

分别取出 \(1\)\(2\)\(3\)\(4\) 即可。


标准模版代码

#include <iostream>using namespace std;const int N = 5010;//洛谷板子题是5000所以开大点int n;
int f[N], a[N];int main()
{scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);f[i] = 1;//初始子序列只有一个字母时长度为1}for (int i = 0; i < n; i++)for (int j = 0; j < i; j++){if (a[j] < a[i]) //上升f[i] = max(f[i], f[j] + 1);//最长}int res = 0;for (int i = 0; i < n; i++) res = max(res, f[i]);printf("%d", res);return 0;
}

输出具体方案

代码解释1int maxLen = *max_element(f.begin(), f.end());

// 代码整体功能:
// 这段代码的目的是在一个整数容器 f 中找到最大的元素,并将其存储在 maxLen 变量中。

// 代码解释:
// 首先,我们使用了标准库中的 max_element 函数。
// max_element 函数接受两个迭代器作为参数,这里是 f.begin()f.end()
// f.begin() 表示容器 f 的起始迭代器,f.end() 表示容器 f 的结束迭代器。
// 这个函数会遍历 f 容器中的元素,从 f.begin() 开始,直到 f.end() 之前的元素。
// 然后,它会找出这些元素中的最大值。

// 接着,max_element 函数返回一个迭代器,该迭代器指向容器中最大元素的位置。
// 由于 max_element 函数返回的是一个迭代器,而我们想要的是元素的值,
// 所以在函数调用前使用 * 运算符进行解引用操作。
// 这将迭代器指向的元素的值提取出来,并存储在 maxLen 变量中。

代码解释2int k = find(f.begin(), f.end(), maxLen) - f.begin();

// 代码整体功能:
// 这段代码的目的是在容器 f 中查找元素 maxLen 的位置,并将该位置存储在变量 k 中。

// 代码解释:
// 首先,使用 find 函数来查找元素。find 函数接受三个参数:
// 1. 起始迭代器 f.begin(),表示从容器 f 的开始位置开始查找。
// 2. 结束迭代器 f.end(),表示查找范围截止到容器 f 的末尾位置(不包括 f.end() 所指向的元素)。
// 3. 要查找的元素 maxLen,它是之前代码中找出的容器 f 中的最大元素。

// find 函数会在 f.begin()f.end() 的范围内查找第一个等于 maxLen 的元素。
// 如果找到了,find 函数会返回一个迭代器,该迭代器指向找到的元素。
// 如果没找到,find 函数会返回 f.end()

// 然后,通过 find(f.begin(), f.end(), maxLen) - f.begin() 计算元素 maxLen 在容器中的位置:
// 用 find 函数返回的迭代器减去 f.begin() 迭代器,得到的结果是一个整数,表示元素 maxLen
相对于容器 f 起始位置的偏移量。
// 这个偏移量存储在变量 k 中。

代码解释3cout << path[i] << " \n"[i == path.size() - 1];

" \n"[i == path.size() - 1];:这是一个比较巧妙的写法。" \n"是一个字符串常量,它包含一个空格和一个换行符。
[i == path.size() - 1]是一个条件表达式,当i等于path.size() - 1(即遍历到最后一个元素)时,表达式的值为 1,此时取字符串" \n"中的第二个字符(即换行符\n);否则表达式的值为 0,取字符串" \n"中的第一个字符(即空格)。这样做的效果是,除了最后一个元素输出后换行,其他元素输出后都跟一个空格。

输出具体方案代码

#include <algorithm>
#include <iostream>
#include <vector>using namespace std;int main()
{int n = 0;cin >> n;vector<int> a(n, 0); // 原数组vector<int> f(n, 1); // 状态vector<int> g(n, 0); // 具体方案for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0; i < n; i++){for (int j = 0; j < i; j++){if (a[j] < a[i]){if (f[i] < f[j] + 1){f[i] = f[j] + 1;g[i] = j; // 记录i是由j更新的}}}}int maxLen = *max_element(f.begin(), f.end());int k = find(f.begin(), f.end(), maxLen) - f.begin();vector<int> path;for (int i = 0; i < maxLen; i++){path.push_back(a[k]);k = g[k];}reverse(path.begin(), path.end());for (int i = 0; i < path.size(); i++){cout << path[i] << " \n"[i == path.size() - 1];}return 0;
}

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

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

相关文章

vue指令v-cloak,v-text,v-html,v-pre

1.v-cloak 配合css使用,用于解决加载过慢(复杂逻辑处理闪烁问题)编译时元素会自动加上属性v-cloak,编译结束后会自动消失 csscss[v-cloak]{display: none }html<div v-cloak> xxx</div> 2.v-html & v-text & v-pre 引用https://blog.csdn.net/weixin_5…

IDEA如何将代码进行注释

前言 大家好,我是小徐啊。我们在使用IDEA开发Java应用的时候,一般都是需要写注释的,这些注释帮助我们和别人更好的理解代码的含义,可以说是必不可少的。在使用IDEA开发时,其实是可以快捷的进行代码注释的,而不用手动去注释,那么IDEA该如何进行代码注释呢? 如何进行代码…

完整的 c 语言用到的基础知识总结

作者: baron 博客: baron-z.cn用于记录 c 语言基础知识,如果没有特别说明本文的所有代码编译环境为 gcc 编译器编译,学习资料来自狄泰软件学院可在淘宝购买学习一、基本数据类型 1、数据类型含义 固定内存大小的别名作用 创建变量c语言数据类型表Type Storage size Valu…

seqtk 生信工具的安装与使用

001、安装git clone https://github.com/lh3/seqtk.git cd seqtk/ make ./seqtk | head -n 3 002、

[Tools] SWC Intro

SWC SWC 英文全称为 Speedy Web Compiler,翻译成中文为“快速网页编译器”。 官网地址:https://swc.rs/来看一下官方的介绍:SWC is an extensible Rust-based platform for the next generation of fast developer tools. Its used by tools like Next.js, Parcel, and Deno…

数据迁移丨借助 AI 从 PostgreSQL 到 GreatSQL

数据迁移丨借助 AI 从 PostgreSQL 到 GreatSQL本文将介绍如何从 PostgreSQL 到 GreatSQL 的数据迁移,并运用 AI 协助迁移更加方便。迁移的方式有很多,例如:pg_dump:导出SQL文件,修改后导入 GreatSQL 数据库。 COPY:导出txt文本文件,导入 GreatSQL 数据库。 pg2mysql:从…

圆方树学习笔记

元方树。 下文除特殊强调外,所有图皆为无向图。 引入割点:在图中,删除某个点后,导致图不再连通的点。 点双连通:在一张图中,取两个点 \(u\)、\(v\),无论删去哪个点(除 \(u\)、\(v\) 自身外),\(u\)、\(v\) 都能连通,我们就说 \(u\) 和 \(v\) 点双连通。 点双连通分量…

WordPress产品导入后内容出现乱码,以及附属一些别的功能

效果图如下 该插件附带了一个可以把产品描述里面的超链接给去掉,以及有的产品图片点击会在地址栏上面显示图片的路径,在该插件可以进行关闭,并且替换成一个模态窗,还有对产品邮费展示进行了处理,到金额到达包邮的时候,别的邮费进行隐藏 下面是该插件源码目录结构duola …

如何利用甘特图进行高效管理?——附应用工具

通过快速创建甘特图并合理利用其进行项目管理,可以显著提升项目管理的效率和质量。同时,不断优化甘特图和项目管理流程也是实现持续改进的关键。甘特图通过横轴表示时间,纵轴表示任务,每个任务的开始和结束时间通过横向条形表示。甘特图可以帮助管理者对项目中的各个任务进…

互联网(internet)的基本组成

一般而言,互联网被认为由三个部分组成: Edge NetworkDevices and Endpoints: This part consists of all the devices at the periphery of the network that users directly interact with. It includes personal computers, laptops, smartphones, tablets, and various In…

WebRTC 笔记

目录通话建立流程特别提醒代码创建 RTCPeerConnection 对象获取本地摄像头/麦克风创建发起方会话描述对象(createOffer)连接的远程对等方属性(setRemoteDescription)建立一条最优的连接方式 WebRTC 允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(…