最长递减子序列 动态规划
题目描述
输入数字 n ,和 n 个整数,输出该数字串中的最长递减序列。
输入格式
第一行包含一个整数 n ,表示数字的个数。
第二行包含 n 个整数,表示数字串。
输出格式
输出该数字串中的最长递减序列。
输入样例
8
9 4 3 2 5 4 3 2
输出样例
9 5 4 3 2
代码1:
#include <bits/stdc++.h>
#define MX 100
using namespace std;
//动态规划
int n;
int a[MX],dp[MX],pre[MX],mx = 0;
int main(){
cin>>n;
for(int i = 1;i <= n;i++)
{
cin>>a[i];
dp[i] = 1;
pre[i] = -1;
}
for(int i = 1;i <= n;i++)
{
for(int j = i+1;j <= n;j++)
{
if(a[j] < a[i] && dp[j] < dp[i]+1)
{
dp[j] = dp[i]+1;
pre[j] = i;
mx = max(mx,dp[j]);
}
}
}
int cnt = 0,res[MX];
for(int i = n;i >= 1;i--)
{
if(dp[i] == mx)
{
int t = i;
res[++cnt] = a[t];
while(pre[t] != -1)
{
t = pre[t];
res[++cnt] = a[t];
}
break;
}
}
for(int i = cnt;i >= 1;i--)
{
cout<<res[i]<<" ";
}
return 0;
}