最长不下降子序列与输出序列
题目描述
设有由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; }