c++算法之最长递增子序列(LIS)

c++算法之最长递增子序列(LIS)题目:输入一个整数n,随后输入n个整数,求这个长度为n的序列中严格递增的子序列的最长长度。例:输入:6143265输出:3解题思路:动态规划。将输入的序列存入一个数组v中,另外再定义一个数组a,用以存储以当前数字v[i]结尾时,最长递增子序列的长度是多少。定义数组时,全部初始化为1,初始状态表示的是最坏的情况,以v[i]结尾的最长递增子序列就是v[i]它本身,长度为1。接着将v[i]逐一…

大家好,又见面了,我是你们的朋友全栈君。

题目:
输入一个整数n,随后输入n个整数,求这个长度为n的序列中严格递增的子序列的最长长度。

例:
输入:

6
1 4 3 2 6 5

输出:
3

解题思路:
动态规划。将输入的序列存入一个数组v中,另外再定义一个数组a,用以存储以当前数字v[i]结尾时,最长递增子序列的长度是多少。

定义数组时,全部初始化为1,初始状态表示的是最坏的情况,以v[i]结尾的最长递增子序列就是v[i]它本身,长度为1。接着将v[i]逐一与前面的数字v[x]进行比较,x∈[0,i),若发现v[x]<v[i],说明v[i]可作为后继元素增加到以v[x]结尾的递增子序列中,则a[i]=v[x]+1,但是在将v[i]逐一与v[x]进行比较的过程中,我们需要找出最大的v[i],所以将每一次v[i]需要更新的值与它本身的值进行比较,取大的那一个就行了,保持在每一次v[i]与v[x]比较之后,v[i]的值都是最大的。最后,找出数组v中最大值就是结果。
再来看看样例,a[0]~a[5]的初始值都是1,
首先求以v[1]结尾的最长递增子序列长度。v[1]>v[0],说明4可作为1的后继成为递增序列,以1结尾的递增序列长度a[0]为1(默认值),则a[1]可以等于a[0]+1,同时a[1]本身也是1,a[0]+1>a[1],所以最终a[1]=a[0]+1=2;接着求v[2]
结尾的最长递增子序列长度,将v[2]与v[0]进行比较,v[2]>v[0]同时a[0]+1>a[2],所以a[2]=a[0]+1=2;将v[2]与v[1]进行比较,v[2]<v[1],则a[2]的值不变,最终a[2]=2;接着求v[3]结尾的最长递增子序列长度,v[3]>v[0]且a[0]+1>a[3],a[3]=a[0]+1=2;v[3]<v[1],a[3]值不变为2;v[3]<v[2],v[3]值不变为2,所以最终a[3]的值为2。后面的v[4]与v[5]依此类推。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
 int n;
 cin>>n;
 vector<int> v(n);
 vector<int> a(n,1);
 for(int i=0;i<n;i++)
  cin>>v[i];
 for(int i=1;i<n;i++)
  for(int j=0;j<i;j++)
   if(v[i]>v[j])
    a[i]=max(a[i],a[j]+1);
 sort(a.begin(),a.end());
 cout<<a[n-1];
 return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136700.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 黑盒测试的测试方法有哪些_黑盒测试包含哪些测试内容

    黑盒测试的测试方法有哪些_黑盒测试包含哪些测试内容一般我们在做软件测试的时候,会遇到黑盒测试,白盒测试,我们今天主要说的是黑盒测试的主要测试方法有那些。接下来就是干货了。最常见的是  边界值 等价类 错误推测法 场景法 因果图法判定表组成法 正交实验设计 下面是详细的解释:前言:在期末考到来的时候复习下黑盒测试。文章copy&paste了很多别人的东西。文章里有很多不足之处。欢迎拍砖!!!!!

    2022年10月21日
    3
  • Pytest(6)重复运行用例pytest-repeat

    Pytest(6)重复运行用例pytest-repeat前言平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来。自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,

    2022年8月6日
    5
  • 什么叫买单报关_代理报关和买单报关费用是一样的吗

    什么叫买单报关_代理报关和买单报关费用是一样的吗报关是指货物、行李和邮递物品、运输工具等在进出关境或国境时由所有人或其代理人向海关申报,交验规定的单据、证件,请求海关办理进出口的有关手续。我国海关规定报关时应交纳的单据、证件。有:进出口货物报关单、进出口货物许可证、商品检验证书、动植物检疫证书、食品卫生检验证书以及提货单、装货单、运单、发票、装箱单等。买单出口,其实就是没有出口权的工厂或SOHO通过买别的进出口公司的核销单,以该公司的名义进行外贸出口。买单出口所买的“单”主要是指核销单,但是卖单出口服务的公司除了提供核销单之外还需要提供与核销单抬头一

    2026年2月6日
    4
  • 项目范围管理:项目范围管理的概念是什么_项目范围管理规划案例

    项目范围管理:项目范围管理的概念是什么_项目范围管理规划案例项目范围管理包括确保项目做且只做所需的全部工作,以成功完成项目的各个过程。 项目范围管理关注的焦点是:什么是包括在项目之内的,什么是不包括在项目之内的,即为项目工作明确划定边界。 对项目范围管理和控制的有效性,是衡量项目是否达到成功的一个必要标准,项目范围的管理不仅仅是项目整体管理的一个主要部分,同时在项目中不断地重申项目工作范围,有利于项目不偏离轨道,是项目中实施控制管理的一个主要手段。 项目范围是项目其他各方面管理的基础。如果范围都弄不清楚,成本、进度和质量等就无从谈起。确认项目范围对项目管理有如

    2022年9月22日
    4
  • 如何更改layui弹出层样式「建议收藏」

    如何更改layui弹出层样式「建议收藏」div设置屏幕宽度

    2022年5月10日
    43
  • 深入理解 Spring 之 SpringBoot 事务原理

    深入理解 Spring 之 SpringBoot 事务原理前言今天是平安夜,先祝大家平安夜快乐。我们之前的数十篇文章分析了Spring和Mybatis的原理,基本上从源码层面都了解了他们的基本原理,那么。在我们日常使用这些框架的时候,还有哪些疑问呢?就楼主而言,楼主已经明白了IOC,AOP的原理,也明白了Mybatis的原理,也明白了Spring和Mybatis是如何整合的。但是,我们漏掉了JavaEE中一个非常重要的特性:事

    2022年6月11日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号