最长不下降子序列与输出序列

题目描述

设有由n个不相同的整数组成的数列,记为

若存在

且有

则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列

 

样例数据

输入

13 7 9 16 38 24 37 18 44 19 21 22 63 15

输出

max=8
7 9 16 18 19 21 22 63

 

分析

不断维护最大值即可

 

代码

#include <bits/stdc++.h>

#define Enter puts("")
#define Space putchar(' ')

using namespace std;

typedef long long ll;
typedef double Db;

template <typename T>

inline ll Read() {
    ll Ans = 0;
    char Ch = getchar() , Las = ' ';
    while(!isdigit(Ch)) {
        Las = Ch;
        Ch = getchar();
    }
    while(isdigit(Ch)) {
        Ans = (Ans << 3) + (Ans << 1) + Ch - '0';
        Ch = getchar();
    }
    if(Las == '-')
        Ans = -Ans;
    return Ans;
}

inline void Write(ll x) {
    if(x < 0) {
        x = -x;
        putchar('-');
    }
    if(x >= 10)
        Write(x / 10);
    putchar(x % 10 + '0');
}

int a[10100];
int Dp[10100];
int n , Maxn = -999999;
int Count[10100],Ans;

inline void Print(int x)
{
    if(!x) return;
    Print(Count[x]);
    Write(a[x]) , Space;
}

int main() 
{
    while(scanf("%d",&a[++n])!=EOF)
    for(int i = 1; i <= n; i++) 
    {
        Dp[i] = 1;
    }
    n--;
    for(int i = 2; i <= n; i++)
        for(int j = 1; j <= i - 1; j++)
        {
            if(a[i] > a[j]) 
            {
                if(Dp[i] < Dp[j] + 1)
                {
                    Dp[i] = Dp[j] + 1;
                    Count[i] = j;
                }
                if(Dp[i] > Maxn)
                {
                    Ans = i;
                    Maxn = Dp[i];
                }
            }
        }
    printf("max=%d\n",Maxn);
    Print(Ans);
    return 0;
}

 

posted @ 2021-04-17 17:57  Tenderfoot  阅读(155)  评论(0编辑  收藏  举报