【模板】求最长不下降序列 [动态规划 LIs]

求最长不下降序列

看不出来哪里还错了.....

d[i]以i为结尾的最长上升子序列的长度     g[i]表示d值为i的最小状态的编号即长度为i的上升子序列的最小末尾值(d[j]=i的j值最小)

liurujia‘s

for(int i=1;i<=n;++i) g[i]=inf;
for(int i=1;i<=n;++i){
    int k=lower_buond(g+1,g+1+n,a[i])-g;
    d[i]=k;
    g[k]=a[i];
}

二昏好难啊.....

贴上90昏代码....

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define Max(x,y) (x)>(y)?(x):(y)
#define Min(x,y) (x)>(y)?(y):(x)
#define ll long long
#define rg register
const int N=200+5,M=200000+5,inf=0x3f3f3f3f,P=99999997;
int n,a[N],g[N],ans=0;
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch==‘-‘,ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int main(){
//    freopen("in.txt","r",stdin);
    rd(n);
    for(int i=1;i<=n;++i) rd(a[i]);
    memset(g,inf,sizeof(g));
    for(int i=1;i<=n;++i){
        int k=lower_bound(g+1,g+1+n,a[i])-g;
        g[k]=a[i];
        ans=max(ans,k);
    }
    printf("max=%d\n",ans);
    for(int i=1;i<=ans;++i) printf("%d ",g[i]);
    return 0;
}
 

原文地址:https://www.cnblogs.com/lxyyyy/p/11180028.html

时间: 2024-10-09 01:37:23

【模板】求最长不下降序列 [动态规划 LIs]的相关文章

算法复习——求最长不下降序列长度(dp算法)

题目: 题目背景 161114-练习-DAY1-AHSDFZ T2 题目描述 有 N 辆列车,标记为 1,2,3,-,N.它们按照一定的次序进站,站台共有 K 个轨道,轨道遵从先进先出的原则.列车进入站台内的轨道后可以等待任意时间后出站,且所有列车不可后退.现在要使出站的顺序变为 N,N-1,N-2,-,1,询问 K 的最小值是多少. 例如上图中进站的顺序为 1,3,2,4,8,6,9,5,7,则出站的顺序变为 9,8,7,6,5,4,3,2,1. 输入格式 输入共 2 行.第 1 行包含 1 

求最长不下降序列个数

求最长不下降序列个数(jdoj-1946) 题目大意:给你一个序列,求所有最长不下降序列的个数. 注释:n(总序列长度)<10000. 想法:维护两个数组,分别表示包含这个数的最长子序列长度和达到这个长度的方案数,最后统计答案,跑两次dp即可. 最后,附上丑陋的代码....... 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int dp[10010]; 5 int a[10010]; 6

1259:【例9.3】求最长不下降序列

传送门:http://ybt.ssoier.cn:8088/problem_show.php?pid=1259 [题目描述] 设有由n(1≤n≤200) 个不相同的整数组成的数列,记为:b(1).b(2).…….b(n)且b(i)≠b(j)(i≠j),若存在i1<i2<i3<…<ie 且有b(i1)<b(i2)<…<b(ie) 则称为长度为e的不下降序列.程序要求,当原数列出之后,求出最长的不下降序列. 例如13,7,9,16,38,24,37,18,44,19,

动态规划——最长不下降子序列(LIS)

最长不降子序列是这样一个问题: 下面介绍动态规划的做法. 令 dp[i] 表示以 A[i] 结尾的最长不下降序列长度.这样对 A[i] 来说就会有两种可能: 如果存在 A[i] 之前的元素 A[j] (j<i),使得 A[j]≤A[i] 且 dp[j]+1>dp[i],那么就把 A[i] 跟在以 A[j] 结尾的 LIS 后面,形成一条更长的不下降子序列(令 dp[i]=dp[j]+1). 如果 A[i] 之前的元素都比 A[i] 大,那么 A[i] 就只好自己形成一条 LIS,但是长度为 1

最长不下降子序列(LIS)

最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: 1 REP(i,n) 2 { 3 f[i]=1; 4 FOR(j,0,i-1) 5 if(a[j]<=a[i]) f[i]=max(f[i],f[j]+1); 6 } DP是O(n^2)的,我感觉已经不错了不过还有超碉的nlogn的方法. nlogn的方法: 用栈和二分查找. 遇到一个元素a[i],若它不小于栈顶s[top],直接入栈:若大于栈顶,则

Laoj P1194 [hnoi97]最长不下降序列

问题背景 动态规划入门-第13题 试题描述 设有整数序列b1,b2,b3,-,bm,若存在i1<i2<i3<-<in,且bi1<bi2<bi3<-<bin,则称 b1,b2,b3,-,bm中有长度为n的不下降序列bi1,bi2,bi3,-,bin.求序列b1,b2,b3,-,bm中所有长度(n)最大不下降子序列.例如3,18,7,14,10,12,23,41,16,24,其中3,18,23,24就是一个长度为4的不下降序列,同时也有3,7,10,12,16,

【模板】最长不下降子序列

====接力dalao完成==== 前文链接:(CSP-S RP++!) 对前文的一些补充: 首先清楚最长不下降子序列是一个递增但是允许不同位元素相等的序列.而最长上升子序列则是一个单调递增的序列. 而两者都是子序列,所以子序列的长度一定小于等于原序列.且子序列在原序列的位置不一定连续. 这个O(nlogn)的算法使用的是贪心的思想. 为了帮助理解,请与以下代码对比阅读: #include<iostream> using namespace std; int a[1000001],dp[100

Bridging signals(求最长上升自序列nlogn算法)

Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2582    Accepted Submission(s): 1665 Problem Description 'Oh no, they've done it again', cries the chief designer at the Waferlan

最长不下降序列解决算法

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #include "stdafx.h" #include<iostream> #include<cstdio> #include<cstring> using namespace std