首页 > 其他分享 >最长上升子序列

最长上升子序列

时间:2024-12-23 22:53:48浏览次数:7  
标签:vecdp int ++ 109 vec 序列 上升 最长 dp

最长上升子序列

给定一个长度为 NN 的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式

第一行包含整数 NN。

第二行包含 NN 个整数,表示完整序列。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N≤10001≤N≤1000,
−109≤数列中的数≤109−109≤数列中的数≤109

输入样例:

7
3 1 2 1 8 5 6

输出样例:

4

关于动态规划,我们应该想一个问题,就是如何去规划步骤,我们思考,到如何走到这一步,和这一步的情况是什么样,这样说或许有些抽象。

我们看以下这个例子

例如:

3 1 2 1 8 5 6

按照题意,假设我们走到8 

可能有以下几种情况。

{1,2,8}

{1,8}

{2,8}

那我们只需要最优子结构就好,也就是1,2,8这个情况。

那么我们是不是可以遍历 用dp[i]存储我们最优情况,那么我们要思考,没个最优子结构应该如何推导?

考虑dp[i]可以由哪些状态得到

//如果vec[i] < vec[j]

可以由前面的最大max(dp[j]+1,dp[i])得来。

    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (vec[i] < vec[j]) {
                vecdp[j] = max(vecdp[j], vecdp[i] + 1);
            }
        }
    }

每次在满足vec[i] < vec[j]的情况下,做出两种转移,dp[前面]+1是最优解和此时已得到的是最优解推导而来。

 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1e5;
vector<int> vec(N);
vector<int> vecdp(N);

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> vec[i];
    }
    vecdp.resize(n + 5);
    fill(vecdp.begin(), vecdp.end(), 1);
    
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (vec[i] < vec[j]) {
                vecdp[j] = max(vecdp[j], vecdp[i] + 1);
            }
        }
    }
    
    int ans = *max_element(vecdp.begin(), vecdp.begin() + n);
    cout << ans;
    return 0;
}

 

标签:vecdp,int,++,109,vec,序列,上升,最长,dp
From: https://www.cnblogs.com/AnnaStore/p/18625219

相关文章

  • 【字符串】-Lc5-最长回文子串(中心扩展法)
    写在前面  最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。目录写在前面一、场景描述二、具体步骤1.环境说明2.代码写在后面一、场景描述  最长回文子串。给你一个字符串s,找到s中最长的回文子串。定义:如果字符串的反......
  • Ubuntu下Intel RealSense Depth Camera D455( 景深相机)的ROS2 wrapper 安装、RViz2的使
     IntelRealSenseDepthCameraD455(景深相机)的ROS2驱动安装找到官方开发者中心的文档https://dev.intelrealsense.com/docs/docs-get-started?_ga=2.22118398.41936604.1734785296-801471888.1733994584 先别着急安装文档的指引就先安装好对应的SDK,我在这里走了弯路,这里的......
  • php反序列化
    PHP反序列化漏洞一、基础知识php面向对象的基本概念类与对象classhero{var$name;#var默认是publicpublic$sex;function(){echo$this->name;#必须用this访问类内变量}}$cyj=newhero();$cyj->name='chengyaojin';#注意不是.访问$cyj......
  • .NET 9 New features-JSON序列化
    .NET9已经发布有一段时间了,近期整理一下.NET9的新特性,今天重点分享.NET9JSON序列化方面的改进。先引用官方的说明:在 System.Text.Json 中,.NET9提供了用于序列化JSON的新选项和新的单一实例,可以更轻松地使用Web默认值进行序列化。举个实际的例子,缩进选项JsonSer......
  • 本题要求编写程序,计算序列 1+2/3+3/5+4/7+5/9+6/11+... 的前N项之和。输入格式:在一行
    #include<stdio.h>intmain(){  intn;  scanf("%d",&n);  doublesum=0;  for(inti=1;i<=n;i++){    sum+=(double)i/(2*i-1);  }  printf("%.2f\n",sum);  return0;}注意sum要强制转换类型......
  • 时间序列预测论文讲解-[ICLR 2024]TIMEMIXER: DECOMPOSABLE MULTISCALE MIXING FOR TI
    [ICLR2024]TIMEMIXER:DECOMPOSABLEMULTISCALEMIXINGFORTIMESERIESFORECASTING研究背景与动机模型和方法多尺度混合架构Past-Decomposable-Mixing(PDM)块Future-Multipredictor-Mixing(FMM)块代码思考参考文献:图片来源:代码来源:研究背景与动机现有方法的......
  • ACwing 1524. 最长回文子串
    ACwing1524.最长回文子串因为这个题的数据范围只有1000,所以能O(n)枚举,枚举回文子串的中点,然后向两边延展,看看极限长度是多少,注意每次要区分奇数长度字串和偶数长度字串,两种的计算方式不一样。#include<iostream>#include<cstdio>#include<cstdlib>intmain(){ std::s......
  • 解决 Protocol Buffers 反序列化中的 `InvalidProtocolBufferException$InvalidWireTy
    个人名片......
  • Python中的数据序列(列表,元组,字典,集合)
    目录列表 语法特点 列表的操作方式查操作增操作改操作删操作元组语法运用场景元组的操作字典语法 字典的操作方式增操作删操作 改操作查操作字典的遍历操作集合语法集合的操作方式增操作删操作 查操作 数据序列之间的转换 列表 语法......
  • Java中使用java.time.LocalDate按日期范围生成日期序列
    需求:配置起止日期,计算两个日期间所有的天数,或者当前日期到配置日期间的所有天数,无需关心月份是28天或是31天日期区间为左闭右开,需要闭区间自行处理场景:按日期执行某些业务,数据库记录上次执行日期,计算出配置日期到今天的所有日期,遍历执行,最后更新上次执行日......