/// 求最大递增子序列本身,输出路径,子序列不需要连续
#include <bits/stdc++.h>
using namespace std;
int LIS(int *p, int length , int* pre, int& nindex);
void GetLIS(int *p, int *pre, int nindex, vector<int>& lis);
int main()
{
int a[] = {1,4,5,6,2,3,8,9};
int size = 8;
int *pre = new int[size];
int nindex;
int max = LIS(a, size, pre, nindex);
cout << max << endl;
vector<int> lis; // 保存最长递增子序列
GetLIS(a, pre, nindex, lis);
for (int li : lis) {
cout << li << endl;
}
return 0;
}
int LIS(int *p, int length , int* pre, int& nindex)
{
// p原数组
// length 原数组长度
// pre 上升子序列的前一个元素的索引
// nindex 记录最长上升子序列最后一个元素的索引
int* longest = new int[length]; // 保存最大子串长度
for(int i = 0; i < length; i++)
{
longest[i] = 1;
pre[i] = -1;
}
int nlis = 1; // 表示最大子串的最后一个字符位置,函数返回值, 以为longest要释放掉
nindex = 0;
for(int i = 1; i < length; i++)
{
for(int j = 0; j < i; j++)
{
if(p[j] <= p[i])
{
if(longest[i] < longest[j] +1)
{
longest[i] = longest[j] + 1;
pre[i] = j;
}
}
}
if(nlis < longest[i])
{
nlis = longest[i];
nindex = i;
}
}
delete[] longest;
return nlis;
}
void GetLIS(int *p, int *pre, int nindex, vector<int>& lis) {
while(nindex >= 0)
{
lis.push_back(p[nindex]);
nindex = pre[nindex];
}
reverse(lis.begin(),lis.end());
}