C++ 最长上升子序列(一)

    //给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。
    //所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如[1, 5, 3, 7, 3] 数组,其子序列有:[1, 3, 3]、[7] 等。但[1, 6]、[1, 3, 5] 则不是它的子序列。
    //我们定义一个序列是严格上升的,当且仅当该序列不存在两个下标i和j满足 i < j且 arr[i] >= arr[j]
    //数据范围:0≤n≤1000
    //要求:时间复杂度 O(n^2), 空间复杂度 O(n)
    int LIS(vector<int>& arr) 
    {
        int result = 0;
        int length = arr.size();
        vector<int> amount(length);//amount[i]存放0-i的最长上升子序列的长度
        for (int i = 0; i < length; ++i)
        {
            int m = 0;
            for (int j = i - 1; j >= 0; --j)
            {
                //向前寻找最后元素比arr[i]小的最长上升子序列的长度
                if (arr[j] < arr[i] && amount[j] > m)
                {
                    m = amount[j];
                }
            }
            int num = m + 1;
            amount[i] = num;
            if (num > result) result = num;
        }
        return result;
    }

 

posted @ 2021-12-27 09:08  mshentai  阅读(295)  评论(0编辑  收藏  举报