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

最长上升子序列

时间:2023-04-21 19:55:59浏览次数:69  
标签:idx int pos 数组 LIS 序列 path 上升 最长

#include <bits/stdc++.h>
using namespace std;

/*
测试用例:
8
-7 10  9  2  3  8  8  1
*/

const int N = 1e5 + 10;
int n, a[N];
int f[N], idx; // dp数组,idx:下标指针,因为从1开始,也可以理解为个数、LIS的最大长度
int pos[N];    // p数组,记录原始数组每个数字在dp数组中出现的位置,也就是这个数字a[i]它当过第几名

//输出一条LIS路径,判断需要配合Special Judge
void print() {
    vector<int> path;
    for (int i = n; i >= 1 && idx; i--) //找够idx个就结束了
        if (pos[i] == idx) {            //找到idx,idx-1,idx-2,...的名次
            path.push_back(a[i]);       //记录idx,idx-1,idx-2,...名次的数字入路径数组
            idx--;
        }
    for (int i = path.size() - 1; i >= 0; i--) printf("%d ", path[i]);
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);

    // 1、出发
    f[++idx] = a[1];
    pos[1] = 1; //每个数字都会产生一个在f数组中的位置记录

    // 2、后续元素进行处理
    for (int i = 2; i <= n; i++)
        if (a[i] > f[idx]) {
            f[++idx] = a[i];
            pos[i] = idx; //每个数字都会产生一个在f数组中的位置记录
        } else {
            int t = lower_bound(f + 1, f + idx + 1, a[i]) - f;
            f[t] = a[i];
            pos[i] = t; //每个数字都会产生一个在f数组中的位置记录
        }
    //输出lis长度
    printf("%d\n", idx);

    //输出LIS路径方法
    print();

    return 0;
}

标签:idx,int,pos,数组,LIS,序列,path,上升,最长
From: https://www.cnblogs.com/bothgone/p/17341558.html

相关文章

  • drf之多表关联反序列化保存read_only与write_only
    目录read_only与write_only示例假如前端传入了一组数据:{name:'赛尔达传说:王国之泪',price:350,publish:1,authors:[1,2]}如上:publish按id传入,authors也按id传入。read_only与write_onlyread_only用于序列化write_only用于反序列化这两个是字段参数示例#......
  • 376. 摆动序列
    如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。例如,[1,7,4,9,2,5]是一个摆动序列,因为差值(6,-3,5,-7,3)是正负交替出现的。相反,[1,4,......
  • 序列、排列的全排列的逆序对
    1.题目大意:给一个长度为n的的数组a,n是1到1e5,ai是1到1e5,问a的所有排序的序列的逆序对之和,会有重复的数字出现题目链接:https://ac.nowcoder.com/acm/contest/46597/Etypedeflonglongll;typedeflonglongLL;typedefpair<int,int>pii;typedefunsignedlonglongull;t......
  • 数字序列中某一位的数字
    classSolution{public:intdigitAtIndex(intn){if(!n)return0;longlongstart=1,len=1,cnt=1;//记录区间的起始位置,记录区间长度,cnt记录当前是几位数//往后走,跨度为一个区间while(1){len=start*9*cnt;......
  • Prufer 序列学习笔记
    一、前言感觉它本身没有什么用。主要是用于计数问题。前置知识:树的定义。二、定义对于一棵有\(n\)个节点的无根树\(T\),定义其Prufer序列为执行以下操作\(n-2\)次所形成的长度为\(n-2\)的正整数序列。·选择其编号最小的度数为\(1\)的节点,输出唯一与其相邻的节点的......
  • 分布滞后线性和非线性模型(DLNM)分析空气污染(臭氧)、温度对死亡率时间序列数据的影响|附
    全文下载链接 http://tecdat.cn/?p=23947 最近我们被客户要求撰写关于分布滞后线性和非线性模型的研究报告,包括一些图形和统计输出。分布滞后非线性模型(DLNM)表示一个建模框架,可以灵活地描述在时间序列数据中显示潜在非线性和滞后影响的关联。该方法论基于交叉基的定义,交叉基是......
  • B. Tree Tag(贪心+树的最长直径)
    题目B.TreeTag题意思路因为这是一颗树,所以不管怎么追逐,我们都可以理解为在同一条路上追逐(去掉我们不走的路,就是一个线段)首先,如果da>db,显然能追上,进一步,da==db时,因为路径的长度是有限的,也显然可以追上因为树上任意两点的最短路径是固定的,所以a点可以一直朝着b追,而b是......
  • 最长公共子串
    最长公共子串给定两个字符串,求这两个字符串的不包含数字的最长公共子串的长度。输入格式共两行,每行一个由小写字母和数字构成的字符串。输出格式一个整数,表示给定两个字符串的不包含数字的最长公共子串的长度。如果不存在满足要求的非空公共子串,则输出$0$。数据范围输入......
  • 有向图的拓扑序列
    #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1e5+10;intn,m;inth[N],e[N],ne[N],idx;intd[N];//入线intq[N];voidadd(inta,intb){e[idx]=b;ne[idx]=h[a];h[a]=idx++;}boolto......
  • LOJ #6564 - 最长公共子序列(bitset 求 LCS)
    怎么全天下就我没见过?被薄纱了/ll还是考虑从朴素的DP入手优化。不难发现对于固定的\(i\),相邻的\(dp_{i,j}\)的差要么是\(0\)要么是\(1\),也就是说从压位的考虑角度可能很有前途。因此我们转而维护\(dp_{i,j}\)的差分数组\(v_{i,j}=dp_{i,j}-dp_{i,j-1}\)。考虑新添加一......