子序列+输出子序列
输出子序列:借助路径数组,存储当前的dp最大值是由上面哪个dp得来的。最后用递归层层输出(当前数的path数组为0的时候停止,因为没有上一个路径了)
//不下降子序列
//后面一个数 >= 前面一个数
#include<iostream>
#include<cstring>
using namespace std;
int num[300];
//路径追踪数组,存储当前dp+1的上一个dp
int dp[300];
int path[300];
void path_out(int maxi);
int main(){
//初始化dp数组
for(int i=1;i<=200;i++)dp[i]=1;
//输入数据
int n;
cin >> n;
for(int i=1;i<=n;i++){
cin >> num[i];
}
//开始dp
int maxi=1;
for(int i=1;i<=n;i++){
for(int j=i-1;j>=1;j--){
if(num[j]<=num[i]){
if(dp[j]+1>dp[i]) {
dp[i]=dp[j]+1;
path[i]=j;
}
if(dp[i]>dp[maxi]) {
maxi=i;
}
}
}
}
cout<< "max="<<dp[maxi]<<endl;
path_out(maxi);
return 0;
}
//最大的dp下标
void path_out(int maxi){
//如果这个数没有前导路径了,说明这个数是第一个
if(path[maxi]==0)cout<< num[maxi] << " ";
else{
path_out(path[maxi]);
cout << num[maxi] << ' ';
}
}