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

Posted lxyyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板求最长不下降序列 [动态规划 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;

 

 

以上是关于模板求最长不下降序列 [动态规划 LIs]的主要内容,如果未能解决你的问题,请参考以下文章

用数学语言说一下动态规划求数列最长递增子序列的解

PAT刷题之动态规划专题

动态规划模板1|LIS最长上升子序列

动态规划——总结

luogu1439 模板最长公共子序列 [动态规划][LIS最长上升子序列][离散化]

关于用动态规划法求最大公共子序列的问题