[C++]最长递增子序列的求法之一(学习)

测试代码

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;
/*
array: int数组
length: 数组长度
pre: array同等长度的int数组 记录第i个结点的前驱
nIndex: 最大长度所在的下标
*/
int LIS(const int*array, int length, int* pre, int &nIndex) {
    int* longest = new int[length];
    //初始化数据
    for (int i = 0; i < length; i++) {
        //记录第i的结点最长的长度 初始化为1
        longest[i] = 1;
        //记录当前长度结点的前驱 初始化为-1
        pre[i] = -1;    
    }
    //记录最长的长度  初始化为1
    int nLis = 1;
    for (int i = 0; i < length; i++) {
        for (int j = 0; j < i; j++) {
            if (array[j] <= array[i]) {
                //如果递增 并且通过第j个结点可以达到更长则更新并记录前驱
                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(const int* array, const int* pre,vector<int>&lis,int nIndex) {
    while (nIndex >= 0)
    {
        lis.push_back(array[nIndex]);
        nIndex = pre[nIndex];
    }
    //数组翻转
    reverse(lis.begin(), lis.end());
}

//输出序列
void Print(int *head,int size) {
    for (int i = 0; i < size; i++)
        cout << head[i] << " ";
    cout << endl;
}

int main()
{
    int array[] = {23,56,43,12,78,4,9,10,68,42};
    int size = sizeof(array) / sizeof(int);
    int *pre = new int[size];
    int nIndex;
    int max = LIS(array, size, pre, nIndex);
    vector<int> lis;
    GetLis(array, pre, lis, nIndex);
    Print(array, size);
    cout << "最大长度: " << max << endl;
    Print(&lis.front(),lis.size());
    delete[] pre;
    system("pause");
    return 0;
}

测试结果

这里写图片描述

发布了170 篇原创文章 · 获赞 30 · 访问量 61万+

猜你喜欢

转载自blog.csdn.net/u010989191/article/details/53264901