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

AcWing 895. 最长上升子序列

时间:2023-09-13 21:03:08浏览次数:37  
标签:... 895 int max 跳到 序列 长度 AcWing

JWvFczgRNg.jpg

题目

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

输入格式 第一行包含整数 $N$。

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

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

数据范围 $1≤N≤1000,−10^9≤数列中的数≤10^9$ 输入样例:

7
3 1 2 1 8 5 6

输出样例:

4

思路

状态表示 -- 集合:从前i个物品选,形成递增子序列的长度的集合
         -- 属性:长度
状态计算:
    当遍历到第i个物品时,子序列可能是1~i-1中的传递过来
    从1跳到i: f[i] = f[1] + 1
    从2跳到i: f[i] = f[2] + 1
    ...
    从i-1跳到i: f[i] = f[i - 1] + 1
由以上可知核心公式为:f[i] = max(f[1] + 1, f[2] + 1, ..., f[i - 1] + 1)

代码

#include <iostream>

using namespace std;

const int N = 1010;


int a[N];
int f[N];

int main()
{
    int n;
    cin >> n;
    
    for (int i = 1; i <= n; i ++ ) cin >> a[i];
    
    for (int i = 1; i <= n; i ++ )
    {
        f[i] = 1;  // 对于每个数值,默认子序列长度为1
        for (int j = 1; j < i; j ++ )
        {
            if (a[i] > a[j])
                f[i] = max(f[i], f[j] + 1);
        }
    }
    
    int res = 0;  // 最终结果不一定是f[n],要取max
    for (int i = 1; i <= n; i ++ ) res = max(res, f[i]);
    
    cout << res << endl;
    
    return 0;
}

标签:...,895,int,max,跳到,序列,长度,AcWing
From: https://blog.51cto.com/u_16170343/7463998

相关文章

  • 【230913-2】将1,2,3,4,5,6,7排成先减后增的序列,共有几种排法?
    【数学思路】初看这个问题,似乎抓不到头绪,但抓住1这个关键点后,问题便迎刃而解了。1这个数,在排列好的序列中,必然处于波谷位置,其左边的数呈递减趋势,右边的数呈递增趋势,都比1大。既然是波谷,1就不可能处于序列的首位或末位,只能在中间。至此,问题就变成了:从2,3,4,5,6,7中选择若干数排到1的左右......
  • PHP反序列化补档
    这次遇到了跟常规的反序列化不一样,但本质都是一样的。提了点难度的反序列化基本上都是加了一些特殊的机制或者过滤规则。先来看看题目吧:来自  [网鼎杯2020青龙组]AreUSerialz:打开就是源码:<?phpinclude("flag.php");highlight_file(__FILE__);classFileHandler{......
  • java序列化与反序列化
    理解Java序列化和反序列化serialization(序列化):将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。deserialization(反序列化):将保存在磁盘文件中的java字节码重新转换成java对象称为反......
  • Java反序列化:CommonsCollections3调试分析
    基础知识1.Java反射1.1getConstructorgetConstructor是Java反射API中的一个方法,用于获取类的公共构造方法的引用。构造方法是一种特殊的方法,用于创建类的实例(对象),并且通常在对象创建时进行初始化。getConstructor的函数原型:publicConstructor<?>getConstructor(Class......
  • 最长上升子序列----nlogn算法-模板
    #include<iostream>#include<vector>#defineMAX1010usingnamespacestd;vector<int>len;//这里我返回的满足len[k]>=val[i]且k最小的位置//和上文红色部分的描述是等价的,只是变成了更新len[k],而不是len[k+1]intbisearch(intval){intleft=0,right=len.size(......
  • 最长上升子序列 ---模板
    #include<stdio.h>#include<string.h>intn;intp[100000];intdp[100000];intmain(){ inti,j,k; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++) scanf("%d",&p[i]); memset(dp,0,sizeof(dp)); dp[1]=1; ......
  • hdu1400/acwing 291 Mondriaan's Dream
    题意描述:给定一块n*m的区域,用1*2的长方形填充,长方形可以横着或竖着摆,问一共有多少种填充方案具体思路:题意没什么好说的,简单易懂,很经典的一类状态压缩问题(在棋盘中求填充方案)。观察数据,满足n,m都比较小,但是搜索的复杂度大到无法接受,考虑使用状态压缩求解此类问题......
  • Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞
    JNDI注入什么是JNDIJNDI全称为JavaNamingandDirectoryInterface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。简单从安全......
  • AcWing 5. 多重背包问题 II
    题目有$N$种物品和一个容量是$V$的背包。第$i$种物品最多有$s_i$件,每件体积是$v_i$,价值是$w_i$。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,$N,V$,用空格隔开,分别表示物品种数和背包容积。接下来......
  • Acwing.第 120 场周赛
    Acwing.第120场周赛比赛链接A最大GCD给定一个正整数n(n≥2),请你确定两个正整数a,b,使得1≤a<b≤n,且gcd(a,b)尽可能大。输出gcd(a,b)的最大可能值。gcd(a,b)指a,b的最大公约数。提示:可以通过给定样例观察一下n和答案之间的关系。输入格式第一行包含整数T,表示共有T......