题目链接:登录 - 沐枫OJ
思路:动态规划
/*
b(n-1) < b(n) , 长度为2,序列: b(n-1)b(n)
b(n-1) > b(n) , 长度为1,序列:b(n-1)和b(n)
b(i):从b(i+1)b(i+2)....b(n) ,找出比b(i)大的 且最长的不下降序列
*/
#include <iostream>
using namespace std;
const int N = 107;
int a[N];//存储数据
int len[N];//len[i]:第i个数到达n的最长不下降序列的长度
int nx[N]; //nx[i]:第i个数据的下一个数据的下标
int main(){
int n = 1;
while(cin>>a[n])
n++;
n--;
len[n] = 1;//将最后一位数据的序列长度设为1
int mxid = n;//记录所有数据中最长不下降序列的下标
for(int i = n-1;i >= 1;i--){
int id = i; //i+1~n寻找最长的序列的长度,并记录下标
for(int j = i+1;j <= n;j++){
if(a[j]>a[i]&&len[j]>len[id])
id = j; //第j个数的长度的最长的,记录id
}
len[i] = len[id] + 1;
nx[i] = id;
if(len[i]>len[mxid]) mxid = i;
}
cout << len[mxid] << endl; //输出长度
int l = len[mxid];
for(int i = 1;i <= l;i++){
cout << a[mxid] << " ";
mxid = nx[mxid];
}
return 0;
}