最长递增子序列返回子序列C++代码
时间: 2024-05-30 11:13:28 浏览: 102
这是一个经典算法问题,可以使用动态规划求解。
假设原序列为 A,长度为 n,则令 dp[i] 表示以 A[i] 为结尾的最长递增子序列的长度。
初始时,所有 dp[i] 的值都为 1,因为一个数本身就是一个长度为 1 的递增子序列。
然后使用两重循环枚举 i 和 j(i < j),如果 A[i] < A[j],则 dp[j] = max(dp[j], dp[i] + 1)。
这个算法时间复杂度为 O(n^2)。
最终的最长递增子序列长度为 max(dp[i]),可以使用额外的数组来记录具体的子序列。
以下是一个示例代码:
vector<int> LIS(vector<int>& A) {
int n = A.size();
vector<int> dp(n, 1), pre(n, -1);
int maxlen = 1, maxidx = 0;
for (int i = 1; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (A[j] < A[i] && dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
pre[i] = j;
}
}
if (dp[i] > maxlen) {
maxlen = dp[i];
maxidx = i;
}
}
vector<int> res(maxlen);
for (int i = maxlen - 1; i >= 0; --i) {
res[i] = A[maxidx];
maxidx = pre[maxidx];
}
return res;
}
阅读全文