晚上好🌙🌙🌙
本答案参考通义千问
要解决这个问题,我们可以使用动态规划的方法来找到最长上升子序列(LIS)。动态规划通过构建一个数组来存储到目前为止的最优解,并逐步更新这个数组以找到全局最优解。
动态规划方法
- 初始化一个数组
dp,其中 dp[i] 表示以第 i 个元素结尾的最长上升子序列的长度。 - 将
dp 数组中的所有元素初始化为1,因为每个元素本身都可以构成一个长度为1的子序列。 - 遍历数组
A,对于每一个元素 A[j],再遍历其前面的所有元素 A[i],如果 A[i] < A[j],则更新 dp[j] 的值为 max(dp[j], dp[i] + 1)。 - 最后,遍历
dp 数组,找出最大值,这就是最长上升子序列的长度。
下面是实现上述算法的C++代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> A(n);
for(int i = 0; i < n; ++i) {
cin >> A[i];
}
vector<int> dp(n, 1); // 初始化dp数组,所有元素都为1
// 动态规划填充dp数组
for(int j = 1; j < n; ++j) {
for(int i = 0; i < j; ++i) {
if(A[i] < A[j]) {
dp[j] = max(dp[j], dp[i] + 1);
}
}
}
// 找出dp数组中的最大值
int maxLength = *max_element(dp.begin(), dp.end());
cout << maxLength << endl;
return 0;
}
解释
- 输入处理:首先读取整数
n 和数组 A。 - 动态规划数组初始化:
dp 数组初始化为1,表示每个元素本身可以构成一个长度为1的子序列。 - 状态转移:对于每个元素
A[j],检查它之前的所有元素 A[i],如果 A[i] < A[j],则更新 dp[j] 的值。 - 结果输出:最后输出
dp 数组中的最大值,即最长上升子序列的长度。
这种方法的时间复杂度是 O(n^2),适用于题目给定的范围 1 <= n <= 1000。