📜  最长递增子序列的 CC++ 程序(1)

📅  最后修改于: 2023-12-03 15:10:37.949000             🧑  作者: Mango

最长递增子序列的 C++ 程序

最长递增子序列是一个非常经典的问题,它的解法有很多种。在这份文档中,我们会介绍一种使用动态规划的方法来计算最长递增子序列的长度。

下面是这个算法的 C++ 实现:

#include <iostream>
#include <vector>

int longestIncreasingSubsequence(const std::vector<int>& sequence) {
    int n = sequence.size();
    std::vector<int> memo(n, 1);
    int maxLen = 1;
    for (int i = 1; i < n; ++i) {
        for (int j = 0; j < i; ++j) {
            if (sequence[i] > sequence[j] && memo[i] < memo[j] + 1) {
                memo[i] = memo[j] + 1;
                maxLen = std::max(maxLen, memo[i]);
            }
        }
    }
    return maxLen;
}

int main() {
    std::vector<int> sequence{10, 9, 2, 5, 3, 7, 101, 18};
    std::cout << longestIncreasingSubsequence(sequence) << std::endl; // Output: 4
    return 0;
}
解释

这个算法的基本思想是,对于序列中的每个元素,我们都尝试找到以它为结尾的最长递增子序列。我们用一个 memo 数组来记录这些长度,其中 memo[i] 表示以 sequence[i] 为结尾的最长递增子序列的长度。

我们采用自底向上的方式计算 memo 数组,遍历整个 sequence 数组,对于每个位置 i,我们枚举它前面的位置 j,找到所有可以扩展以 sequence[j] 结尾的递增子序列的位置,然后将 memo[i] 设置为 memo[j] + 1,并更新 maxLen。最后,返回 maxLen 即可。

时间复杂度

序列长度为 n,对于每个元素,我们需要枚举前面的元素,因此总时间复杂度为 O(n^2)。

空间复杂度

我们需要使用 memo 数组来存储每个位置上的最长递增子序列长度,因此空间复杂度为 O(n)。

参考资料

以上就是最长递增子序列的 C++ 实现。