第一个是题目ac的代码 ,第二个基础上再输出子序列 可以对比一下!
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N],f[N];
int main()
{
int n, m;
cin >> n ;
for (int i = 1;i <= n;i++)
cin >> a[i];
for (int i = 1;i <= n;i++)
{
f[i] = 1;//至少是1 就这个数自己
for (int j = 1;j <= i - 1;j++)
if (a[i] > a[j]) {
f[i] = max(f[i],f[j] + 1);
}
}
int res = 0;
for (int i = 1;i <= n;i++) res = max(res, f[i]);
cout<<res;
system("pause");
}
输出子序列 ↓
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N], f[N],g[N];//g来记录序列号
int main()
{
int n, m;
cin >> n;
for (int i = 1;i <= n;i++)
cin >> a[i];
for (int i = 1;i <= n;i++)
{
f[i] = 1;//至少是1 就这个数自己
for (int j = 1;j <= i - 1;j++)
if (a[i] > a[j]) {
if (f[i] < f[j] + 1)
{
f[i] = f[j] + 1;
g[i] = j;//保存上一节点序号
}
}
}
int k=0;
for (int i = 1;i <= n;i++)
if (f[k] < f[i]) k = i;
cout << f[k]<<endl;
int len = f[k];//序列长度
for (int i = 0;i < len;i++)
{
cout << a[k];
k = g[k];
}
system("pause");
}