用c++编写给定一个无序的整数序列a[0..n- 1],求其中最长递增子序列的长度。例如,a[]={2,1,5,3,6,4,8,9,7},n=9,其最长递增子序列为{1,3,4,8,9},结果为5。
时间: 2024-11-06 16:35:33 浏览: 34
动态规划问题-最长单调递增子序列问题
在 C++ 中,我们可以使用动态规划算法来解决这个问题。一种常见的解决方案是使用“最长递增子序列”(LIS)的滑动窗口方法。这里是一种简洁的实现思路:
```cpp
#include <vector>
using namespace std;
int lengthOfLIS(vector<int>& nums) {
if (nums.empty()) return 0;
vector<int> dp(nums.size(), 1); // 初始化dp数组,每个元素初始长度为1
int max_len = 1; // 最长递增子序列长度
for (int i = 1; i < nums.size(); ++i) {
for (int j = 0; j < i; ++j) {
if (nums[i] > nums[j]) { // 如果当前元素大于之前的某个元素
dp[i] = max(dp[i], dp[j] + 1); // 更新当前元素的最大长度
}
}
max_len = max(max_len, dp[i]); // 比较更新后的dp值和max_len
}
return max_len;
}
```
在这个代码中,`dp[i]`表示以`nums[i]`结尾的最长递增子序列的长度。我们从第二个元素开始遍历整个序列,对于每个元素,如果它比前面的某个元素大,那么就尝试将那个元素的子序列长度加一,并更新`dp[i]`。
最后返回`max_len`,即整个序列中最长递增子序列的长度。
阅读全文