📅  最后修改于: 2023-12-03 14:55:23.514000             🧑  作者: Mango
最长递增子序列(Longest Increasing Subsequence, LIS)是一种经典的算法问题,在计算机科学领域被广泛应用。在给定序列中,LIS是指找到最长的子序列,该子序列的元素按照递增的顺序排列。
下面是一个使用动态规划解决最长递增子序列问题的C++程序:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int longestIncreasingSubsequence(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n, 1); // dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
int maxLength = 1;
for (int i = 0; i < n; i++) {
maxLength = max(maxLength, dp[i]);
}
return maxLength;
}
int main() {
vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18};
int length = longestIncreasingSubsequence(nums);
cout << "最长递增子序列的长度为: " << length << endl;
return 0;
}
这个程序使用动态规划的方法解决最长递增子序列问题。首先,我们定义一个长度为n
的一维数组dp
,其中dp[i]
表示以nums[i]
结尾的最长递增子序列的长度。初始化时,将dp
数组的所有元素设置为1,因为每个元素本身都是一个递增子序列。
然后,我们利用两层循环遍历整个输入数组nums
。外层循环用来遍历每个元素,内层循环用来查找在当前元素之前比它小的元素,并更新dp
数组中的值。如果找到了比nums[i]
小的元素nums[j]
,则说明可以将nums[i]
添加到以nums[j]
结尾的最长递增子序列中,此时更新dp[i]
为dp[j] + 1
。
最后,我们遍历整个dp
数组,找到其中的最大值,即为最长递增子序列的长度。
在示例中,给定序列为[10, 9, 2, 5, 3, 7, 101, 18]
,最长递增子序列为[2, 3, 7, 18]
,其长度为4。程序输出结果为最长递增子序列的长度为: 4
。
以上就是一个使用动态规划解决最长递增子序列问题的C++程序。
请注意,此程序未处理输入序列为空的情况,如果输入为空,可能会导致数组越界的问题,需要根据具体情况进行异常处理。