题目描述
给定一个整数序列,输出它的最长递减(注意不是“不递增”)子序列。
输入
输入包括两行,第一行包括一个正整数N(N<=1000),表示输入的整数序列的长度。第二行包括用空格分隔开的N个整数,整数范围区间为[-30000,30000]。
输出
输出最长递减子序列,数字之间有一个空格。
样例输入
8
9 4 3 2 5 4 3 2
样例输出
9 5 4 3 2
这道题是一道 最长递增子序列问题 只不过要把最长的递增子序列打印出来。
f[i] 表示的是以元素a[i]结尾的最长递增子序列的长度。
dp[0] = 1
dp[i] = max(dp[j]) + 1 (0 <= j < i)
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
int a[1010];
int f[1010];
int pre[1010];
int main(){
int n;
stack<int> stk;
cin>>n;
for (int i = 0; i < n; ++i){
cin>>a[i];
}
memset(pre,-1,sizeof pre);
f[0] = 1;
for (int i = 1; i < n; ++i){
for (int j = 0; j < i; ++j)
if (a[i] < a[j]){
if(f[i] < f[j])
pre[i] = j; // pre[] 用于保存每个结点的前继结点。
f[i] = max(f[i],f[j]);
}
f[i] += 1;
}
int res = 0,index_res = -1;
for (int i = 0 ; i < n; ++i){
if (f[i] > res) index_res = i;
res = max(res,f[i]);
}
while(index_res != -1){
stk.push(a[index_res]);
index_res = pre[index_res];
}
while(stk.size()){
cout<<stk.top()<<" ";
stk.pop();
}
return 0;
}