首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

求最长递增子序列C++的长度

最长递增子序列是指在一个序列中,找到最长的一个子序列,使得子序列中的元素按照顺序递增。以C++语言为例,可以使用动态规划算法来解决这个问题。

动态规划算法的思路是,定义一个数组dp,dp[i]表示以第i个元素结尾的最长递增子序列的长度。初始化dp数组的所有元素为1,因为每个元素本身都可以作为一个长度为1的递增子序列。

然后,从第2个元素开始遍历原始序列,对于第i个元素,再从第1个元素到第i-1个元素依次判断,如果第j个元素小于第i个元素,并且dp[j]+1大于dp[i],则更新dp[i]为dp[j]+1。这样遍历完整个序列后,dp数组中的最大值即为最长递增子序列的长度。

以下是示例的C++代码:

代码语言:txt
复制
#include <iostream>
#include <vector>
using namespace std;

int findLengthOfLIS(vector<int>& nums) {
    int n = nums.size();
    vector<int> dp(n, 1);
    int maxLength = 1;
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (nums[i] > nums[j] && dp[j] + 1 > dp[i]) {
                dp[i] = dp[j] + 1;
            }
        }
        maxLength = max(maxLength, dp[i]);
    }
    return maxLength;
}

int main() {
    vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18};
    int length = findLengthOfLIS(nums);
    cout << "最长递增子序列的长度为:" << length << endl;
    return 0;
}

该算法的时间复杂度为O(n^2),其中n为序列的长度。对于较大的序列,可能会导致算法运行时间较长。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

最长增子序列python_最长增子序列并输出序列

一, 最长增子序列问题描述 设L=是n个不同实数序列,L增子序列是这样一个子序列Lin=,其中k1<k2<…<km且aK1<ak2...最大m值。 二, 第一种算法:转化为LCS问题求解 设序列X=是对序列L=按递增排好序序列。...那么显然X与L最长公共子序列即为L最长增子序列。这样就把最长增子序列问题转化为最长公共子序列问题LCS了。 最长公共子序列问题用动态规划算法可解。...设Li=,Xj=,它们分别为L和X序列。令C[i,j]为Li与Xj最长公共子序列长度。...最长增子序列算法时间复杂度由排序所用O(nlogn)时间加上LCSO(n2)时间,算法最坏时间复杂度为O(nlogn)+O(n2)=O(n2)。

71850
  • 【一天一道Leetcode】最长增子序列长度

    题目描述: 给一个整数数组nums, 找到其中最长严格递增子序列长度。 子序列是由数组派生而来序列,删除(或不删除)数组中元素而不改变其余元素顺序。...例如举例所示: 输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长增子序列是[2,3,7,101],因此长度为4。...输入:nums = [0,1,0,3,2,3] 解释:最长增子序列是[0,1,2,3],因此长度为4。...02 代码分析 由题目描述可知 设数组dp[i]值代表数组nums 前i个数字最长增子序列长度 设j∈[0,i),每轮计算新dp[i]时, 遍历[0,i)列表区间,做以下判断: 1.当nums[i...[i]无法接在nums[j]之后, 此情况上升子序列不成立,跳过 在情况1中,计算出dp[j]+1最大值,即为数组nums最长上升子序列长度

    1.1K20

    最长连续元素序列长度

    题目描述 给定一个无序整数类型数组,最长连续元素序列长度。 例如: 给出数组为[100, 4, 200, 1, 3, 2], 最长连续元素序列为[1, 2, 3, 4]....返回这个序列长度:4 你需要给出时间复杂度在O(n)之内算法 思路: 先排序,记住三个数 int count=1;//当前连续序列长度 int last=num[0];//上一个数字(连续判断条件...) int max=1;//前面最大连续序列长度时候搞错了一个点,就是1,1,2,3,算连续三个,我算成连续四个了,后来改掉了 代码: public int longestConsecutive...(int[] num) { // 给定一个无序整数类型数组,最长连续元素序列长度。...// 例如: // 给出数组为[100, 4, 200, 1, 3, 2], // 最长连续元素序列为[1, 2, 3, 4].

    66330

    最长增子序列LISO(nlogn)求法

    大家好,又见面了,我是你们朋友全栈君。 最长增子序列(Longest Increasing Subsequence)是指n个数序列最长单调递增子序列。...每次我们遍历数组nums,只需要做以下两步中一步: 如果 x 比所有的tails都大,说明x可以放在最长序列末尾形成一个新自许下,那么就把他append一下,并且最长序列长度增加1 如果tails...说明到目前为止长度为1增子序列末尾最小为3,长度为2增子序列末尾最小为4。...说明到目前为止长度为1增子序列末尾最小为3,长度为2增子序列末尾最小为4,长度为3增子序列末尾最小为7. 4. x = 2,此时x小于tails末尾,需要用二分查找到比x大最小那个数更新之...说明到目前为止长度为1增子序列末尾最小为2,长度为2增子序列末尾最小为4,长度为3增子序列末尾最小为7。

    57020

    动态规划:本周我们都讲了这些(系列八)

    周二 周二开始讲解子序列问题,先来一道入门题目 动态规划:最长增子序列寻找最长增子序列长度。 dp[i]定义 dp[i]表示i之前包括i最长上升子序列。...周三 动态规划:最长连续递增序列这次要求连续递增子序列长度了,注意是**“连续”** 确定dp数组(dp table)以及下标的含义 dp[i]:以下标i为结尾数组连续递增序列长度为dp[i]...确定递推公式 dp[i + 1] = dp[i] + 1; 注意这里就体现出和动态规划:300.最长增子序列区别!...dp数组如何初始化 以下标i为结尾数组连续递增序列长度最少也应该是1,即就是nums[i]这一个元素。...注意这里要取dp[i]里最大值,所以dp[2]才是结果! 在动规分析中,关键是要理解和动态规划:300.最长增子序列区别。 要联动起来,才能理解递增子序列怎么,递增连续子序列又要怎么

    35410

    动态规划经典题之最长上升子序列

    思路二(动态规划):涉及到最优解问题,都可以考虑用动态规划方法去解。时间复杂度为O(n^2)。 1、定义状态 LIS(i) 表示以第 i 个元素结尾最长增子序列长度。...求出以前面元素结尾最长增子序列长度之后,即可求出以后面元素结尾最长增子序列长度。 ?...如上图示,以 1 结尾最长增子序列长度还是 1;对于 4 来说 4 > 1,所以可以凑成当前最长增子序列且其长度为以 1 结尾最长增子序列长度加 1 等于 2;同理对 2 来说,其前面的两个元素是...1 和 4,由于 4 > 2,不能与 2 凑成当前最长增子序列,但是 1 < 2,因此能与 2 凑成当前最长增子序列长度为 1 + 1 = 2;同理对 3 来说,以 3 结尾最长增子序列长度为以...2 结尾最长增子序列长度加 1 等于 3。

    94710

    动态规划:最长连续递增序列

    ,找到最长且 连续递增序列,并返回该序列长度。...提示: 0 <= nums.length <= 10^4 -10^9 <= nums[i] <= 10^9 思路 本题相对于昨天动态规划:300.最长增子序列最大区别在于“连续”。...本题要求最长连续递增序列 动态规划 动规五部曲分析如下: 确定dp数组(dp table)以及下标的含义 dp[i]:以下标i为结尾数组连续递增序列长度为dp[i]。...即:dp[i + 1] = dp[i] + 1; 注意这里就体现出和动态规划:300.最长增子序列区别!...在动规分析中,关键是要理解和动态规划:300.最长增子序列区别。 要联动起来,才能理解递增子序列怎么,递增连续子序列又要怎么

    1.9K10

    算法 最长斐波那契子序列长度

    X_{i+2} 给定一个严格递增正整数数组形成序列 arr ,找到 arr 中最长斐波那契式序列长度。...(回想一下,子序列是从原序列 arr 中派生出来,它从 arr 中删掉任意数量元素(也可以不删),而不改变其余元素顺序。...例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 一个子序列) 测试用例: 示例 1: 输入: arr = [1,2,3,4,5,6,7,8] 输出: 5 解释: 最长斐波那契式子序列为...示例 2: 输入: arr = [1,3,7,11,12,14,18] 输出: 3 解释: 最长斐波那契式子序列有 [1,11,12]、[3,11,14] 以及 [7,11,18] 。...2、dp + hash 对于长度为n数列,需要为其构建一个n ^ 2二维数组dp,保存其dp[raw][col]位置满足斐波那契序列组数。

    41910

    文心一言 VS 讯飞星火 VS chatgpt (208)-- 算法导论15.4 5题

    五、设计一个 O($n^2$) 时间算法,一个 n 个数序列最长单调递增子序列。要写代码时候,请用go语言。...文心一言,抛panic: 在 Go 语言中设计一个 O(n^2) 时间复杂度算法来一个 n 个数序列最长单调递增子序列(Longest Increasing Subsequence, LIS)可以使用动态规划方法...最后,我们找到dp数组中最大值,即为所求最长单调递增子序列长度。...chatgpt,代码正常运行: 要设计一个O(n^2)时间复杂度算法来一个n个数序列最长单调递增子序列,可以使用动态规划思想。...dp[i] 表示以 arr[i] 结尾最长单调递增子序列长度

    15920

    动态规划之最长增子序列

    最长增子序列问题就是: 给定序列A=a0,a1,a2,…,an, 如果它序列b1,b2,…,bn满足b1<b2<b3<…<bn 则称这个子序列是一个递增子序列。...A所有子序列中,最长那个就是最长增子序列(LIS) 这是一个经典动态规划问题,我们可以用两种方法来解决。 第一种是比较笨纯dp算法。时间复杂度为O(N2)....使用二分搜索求解LIS长度 主要思路: 用A[n]来存储原序列,第一个元素保存在A[0] 用L[i]来存储一个递增序列,每一位表示长度为i+1增子末尾最小值。...我们希望借此能更新掉原来最长子列最大元素,这样才能为递增子延长提供便利。这也是本算法核心。 这个算法就更绕了,其实就是在维护一个一维数组,使其每一位存储着长度为i递增序列最大元素。...(也就是相应长度增子末尾元素最小值) * 我们希望借此能更新掉原来最长子列最大元素,这样才能为递增子延长提供便利。

    39520

    【数据结构和算法】找到最高海拔

    下面是一些常见使用前缀和算法题目以及解题思路: 2.1.1 最长增子序列长度 题目描述:给定一个无序数组,最长增子序列长度。 解题思路:可以使用前缀和和单调栈来解决这个问题。...然后,使用单调栈记录当前递增子序列起始位置。遍历数组时,如果当前元素大于前缀和,说明可以扩展当前递增子序列,将当前位置入栈。如果当前元素小于等于前缀和,说明当前递增子序列已经结束,弹出栈顶元素。...最后,栈中剩余元素即为最长增子序列起始位置,计算长度即可。 2.1.2 寻找数组中第 k 大元素 题目描述:给定一个无序数组和一个整数k,找到数组中第k大元素。...2.1.3 最长公共子序列长度 题目描述:给定两个字符串,最长公共子序列长度。 解题思路:可以使用动态规划算法来解决这个问题。...如果字符串长度分别为m和n,则可以定义一个二维数组dp[m+1][n+1],其中dp[i][j]表示字符串s1前i个字符和字符串s2前j个字符最长公共子序列长度

    13710
    领券