最长上升子序列 一个数的序列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)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8). 你的任务,就是对于给定的序列,求出最长上升子序列的长度。 时间限制:11000 内存限制:65536 输入 输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。 输出 最长上升子序列的长度。 样例输入 7 1 7 3 5 9 4 8 样例输出 4 c++程序

时间: 2024-04-12 12:33:29 浏览: 15
#include <iostream> #include <vector> using namespace std; int longestIncreasingSubsequence(vector<int>& nums) { int n = nums.size(); vector<int> dp(n, 1); int maxLen = 1; for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { if (nums[i] > nums[j]) { dp[i] = max(dp[i], dp[j] + 1); } } maxLen = max(maxLen, dp[i]); } return maxLen; } int main() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; i++) { cin >> nums[i]; } int result = longestIncreasingSubsequence(nums); cout << result << endl; return 0; }
相关问题

一个数的序列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)等等。这些子序列中最长的长度是4,比如子序列(1,3,5,8)。 你的任务,就是对于给定的序列,求出最长上升子序列的长度。

题目描述:给定一个序列,求其最长上升子序列的长度。 解题思路:动态规划 设dp[i]表示以第i个数结尾的最长上升子序列的长度,则有: dp[i] = max{dp[j]+1} (1<=j<i, aj<ai) 即在前i-1个数中,找到一个数j,使得aj<ai,并且dp[j]+1最大,那么dp[i]就等于dp[j]+1。 最终的答案就是dp数组中的最大值。 时间复杂度:O(n^2) 代码实现:

给定一个无序的整数数组,找到其中最长上升子序列的长度

这个问题可以使用动态规划来解决。 我们可以定义一个数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长上升子序列的长度。初始化 dp 数组的所有元素为 1,因为每个元素本身都可以作为一个长度为 1 的上升子序列。 接下来,我们可以通过两个嵌套的循环来遍历数组 nums。对于每个位置 i,我们可以遍历它之前的所有位置 j (j < i),如果 nums[j] 小于 nums[i],则可以将 nums[i] 加入到以 nums[j] 结尾的最长上升子序列中,从而得到一个以 nums[i] 结尾的更长的上升子序列。因此,我们可以更新 dp[i] 为 dp[j] + 1 和当前 dp[i] 中的较大值。 最后,我们可以遍历 dp 数组,并返回其中的最大值,即为整个数组 nums 的最长上升子序列的长度。 以下是 Python 代码实现: ``` def lengthOfLIS(nums): n = len(nums) if n == 0: return 0 dp = [1] * n for i in range(1, n): for j in range(i): if nums[j] < nums[i]: dp[i] = max(dp[i], dp[j] + 1) return max(dp) ``` 时间复杂度为 $O(n^2)$,空间复杂度为 $O(n)$。

相关推荐

最新推荐

recommend-type

最长公共子序列(动态规划)报告.doc

算法设计与分析实验报告,附已通过源码,供学习参考,共勉♪ 目录摘要如下: 1.问题描述 2.实验目的 3.实验原理 4.实验设计 ...(包括输入格式、算法、输出格式) ...(除了截图外,实验结果还用图表进行了分析) ...
recommend-type

Java基于动态规划法实现求最长公共子序列及最长公共子字符串示例

主要介绍了Java基于动态规划法实现求最长公共子序列及最长公共子字符串,简单描述了动态规划法的概念、原理,并结合实例形式分析了Java使用动态规划法求最长公共子序列以及最长公共子字符串相关实现技巧,需要的朋友...
recommend-type

c++语言写最长公共子序列问题

用c++语言写的最长公共子序列问题,比较经典的动态规划问题。能完美运行,输入2个字符串序列之后就能得出最长公共子序列。
recommend-type

全国GDP时间序列分析.doc

它不仅能从总体上度量国民产出和收入规模,也能从整体上度量经济波动和经济周期状态,成为宏观经济中最受关注的经济数据,被认为是衡量国民经济发展、判断宏观经济运行状况的一个重要指标,也是政府制定经济发展战略...
recommend-type

最长公共子序列实验报告

运用动态规划算法解决最长公共子序列问题,计算最长公共子序列长度的动态规划算法LCS_LENGTH(X,Y)以序列X=&lt;x1, x2, …, xm&gt;和Y=&lt;y1, y2, …, yn&gt;作为输入。输出两个数组c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。