动态规划最长递增子序列
动态规划是一种解决最优化问题的算法技术,特别适用于那些具有重叠子问题和最优子结构的问题。对于寻找最长递增子序列(Longest Increasing Subsequence,LIS)问题,动态规划可以有效地求解。这个问题的基本思想是:
定义状态:设dp[i]表示以第i个元素结尾的最长递增子序列的长度。
状态转移方程:对于每个元素nums[i],它要么被包含在已知的某个最长递增子序列中(长度加一),要么开始一个新的子序列(长度为1)。所以我们有 dp[i] = max(dp[j]+1) 其中j < i 且 nums[j] < nums[i]。
初始化:初始时,所有元素的子序列长度都是1(它们本身就是一个长度为1的递增子序列)。
结果计算:最后的最长递增子序列的长度就是 dp 数组的最大值。
Java动态规划最长递增子序列
动态规划是解决复杂问题的一种方法,通过将大问题分解成小问题并存储已解决结果来优化效率。在Java中,动态规划常用于求解最优化问题,比如计算最长递增子序列(Longest Increasing Subsequence, LIS)。
最长递增子序列是指在一个序列中找到一个具有最长长度且元素单调递增的子序列。经典的动态规划算法Kadane's Algorithm 可以用来解决这个问题。以下是主要步骤:
初始化:为每个元素创建一个数组 dp,长度与原序列相同,初始值设为1,因为每个元素本身都是一个长度为1的递增子序列。
遍历:从第二个元素开始,对于每个元素,比较当前元素与前一个元素,如果当前元素大于前一个元素,则可以将当前元素添加到前一个元素对应的子序列中,更新 dp[i] 为前一个元素 dp[j] + 1,其中 j 是前一个元素的位置。
查找最大值:遍历结束后,dp 数组中的最大值即为最长递增子序列的长度。
构建子序列:回溯找出这个最大长度对应的子序列,通常从 dp 数组的最大值开始,向前查找并记录下所有递增的元素,形成最长递增子序列。
用c++代码实现动态规划最长递增子序列
在C++中,动态规划是一种解决最优化问题的有效方法,可以用于寻找数组中最长递增子序列(Longest Increasing Subsequence, LIS)。下面是一个简单的C++代码实现,使用了Kadane's Algorithm:
#include <iostream>
#include <vector>
int longestIncreasingSubsequence(std::vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
std::vector<int> dp(n, 1); // 初始化每个元素都是单个数就是一个长度为1的递增子序列
for (size_t i = 1; i < n; ++i) {
for (size_t j = 0; j < i; ++j) {
if (nums[i] > nums[j]) {
dp[i] = std::max(dp[i], dp[j] + 1);
}
}
}
return *std::max_element(dp.begin(), dp.end()); // 返回最长递增子序列的长度
}
int main() {
std::vector<int> numbers = {10, 9, 2, 5, 3, 7, 101, 18};
int result = longestIncreasingSubsequence(numbers);
std::cout << "Length of the Longest Increasing Subsequence: " << result << std::endl;
return 0;
}
在这个代码中,dp[i]
表示以第 i
个元素结尾的最大递增子序列长度。通过遍历整个序列,对于每个元素,我们检查它前面的所有元素,如果当前元素大于前一个元素,则更新该位置的dp
值。
相关推荐














