求数组最大递增子序列,并打印出该子序列

/// 求最大递增子序列本身,输出路径,子序列不需要连续

#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());
}


posted @ 2019-09-07 15:24  lllittletree  阅读(988)  评论(0编辑  收藏  举报