c++实现计算由n个整数组成的序列的最长单调递增子序列的长度
时间: 2024-02-01 22:14:06 浏览: 140
可以使用动态规划来解决这个问题。定义一个dp数组,其中dp[i]表示以第i个数为结尾的最长单调递增子序列的长度。对于每个位置i,我们需要遍历前面所有的位置j(j<i),如果nums[j]<nums[i],那么可以将第i个数接在第j个数的后面形成一个更长的上升子序列,即dp[i]=max(dp[i],dp[j]+1)。最终答案就是dp数组中的最大值。
下面是C++代码实现:
```cpp
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
vector<int> dp(n, 1);
int res = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
res = max(res, dp[i]);
}
return res;
}
```
时间复杂度为O(n^2),空间复杂度为O(n)。
相关问题
c++实现c++实现计算由n个整数组成的序列的最长单调递增子序列的长度
这个问题可以使用动态规划来解决。
我们定义一个数组 `dp`,其中 `dp[i]` 表示以第 `i` 个元素为结尾的最长单调递增子序列的长度。
初始时,每个元素自成一个长度为 1 的单调递增子序列,即 `dp[i] = 1`。
然后从 `i=1` 开始遍历整个序列,对于每个 `i`,再从 `j=0` 到 `i-1` 遍历所有小于 `i` 的元素,如果找到一个元素 `j` 比 `i` 小且 `dp[j]` 加上 1 能够使得以 `i` 结尾的子序列变得更长,则更新 `dp[i]` 为 `dp[j]+1`。
最终,最长单调递增子序列的长度就是 `dp` 数组中的最大值。
下面是 C++ 代码实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int longestIncreasingSubsequence(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n, 1); // 初始值为 1,每个元素自成一个长度为 1 的单调递增子序列
int res = 1; // 最长单调递增子序列的长度至少为 1
for (int i = 1; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (nums[j] < nums[i] && dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
}
}
res = max(res, dp[i]); // 更新最长单调递增子序列的长度
}
return res;
}
int main() {
vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18};
cout << longestIncreasingSubsequence(nums) << endl; // 输出 4,即 [2, 3, 7, 101] 是最长单调递增子序列
return 0;
}
```
c++实现设计一个算法,计算由n个整数组成的序列的最长单调递增子序列的长度。 【输入形式】 两行。 第1行为一个正整数n,表示整数的个数,n≤1000。 第2行为n个整数。 【输出形式】 一个整数,为最长单调递增子序列的长度。
好的,这是一个经典的动态规划问题。下面是C++实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
vector<int> dp(n, 1); // dp[i]表示以nums[i]为结尾的最长单调递增子序列的长度
int res = 1; // 最终结果
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = max(dp[i], dp[j] + 1);
res = max(res, dp[i]);
}
}
}
cout << res << endl;
return 0;
}
```
时间复杂度为 $O(n^2)$,空间复杂度为 $O(n)$。如果你想了解更多关于最长单调递增子序列的算法,可以参考《算法竞赛进阶指南》中的相关章节。
阅读全文