#include <iostream>
#include <vector>
using namespace std;
#define MAXLEN 100
int solve(int* a, int n, vector<int>& seq) //数组,长度,存储逆序的序列
{
int res = 0;
int* dp = new int[n]; //存储以a[i]结尾的最大上升子序列长度
int p[MAXLEN]; //保存序列的前一个位置,可以理解为父节点
int k = -1; //保存最大上升子序列的最后位置
for (int i = 0; i < n; i++)
{
dp[i] = 1;
p[i] = -1;
for (int j = 0; j < i; j++)
{
if (a[j] < a[i] && dp[j] + 1 > dp[i])
{
dp[i] = dp[j] + 1;
p[i] = j;
}
}
if (dp[i] > res)
{
res = dp[i];
k = i;
}
}
while (k != -1) //保存结果序列
{
seq.push_back(a[k]);
k = p[k];
}
return res;
}
int main()
{
int a[] = {5,2,8,6,3,6,9,7};
int len = sizeof(a) / sizeof(int);
vector<int> seq;
cout << "len: " << solve(a, len, seq) << endl;
cout << "seq: ";
for (int i = seq.size(); i > 1; i--)
{
cout << seq[i-1] << " -> ";
}
cout << seq[0] << endl;
return 0;
}
最长上升子序列(LIS),求长度并打印子序列
最新推荐文章于 2024-08-15 22:07:52 发布