📅  最后修改于: 2023-12-03 15:10:37.949000             🧑  作者: Mango
最长递增子序列是一个非常经典的问题,它的解法有很多种。在这份文档中,我们会介绍一种使用动态规划的方法来计算最长递增子序列的长度。
下面是这个算法的 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++ 实现。