前言
LeetCode题目:LeetCode 300、674、718
Takeaway:动态规划的子序列系列问题
一、300
动态规划的子序列系列问题,元素不是连续的,所以DP状态转移公式是 max()
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
// 边界值处理
if(nums.size() == 1){
return 1;
}
// 定义DP数组,其含义是第 i 个元素最大子序列, 这题初始化很重要!
vector<int> dp(nums.size(), 1);
int ans = 0;
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); // DP 状态转移公式
}
if(dp[i] > ans){
ans = dp[i]; //记录结果
}
}
}
return ans;
}
};
二、674
动态规划的子序列系列问题,元素是连续的,所以DP状态转移公式是 +1
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
// 边界值处理
if(nums.size() == 1){
return 1;
}
// 定义DP数组,其含义是第 i 个元素最大子序列, 这题初始化很重要!
vector<int> dp(nums.size(), 1);
int ans = 0;
for(int i=1; i<nums.size(); i++){
if(nums[i]>nums[i-1]){
dp[i] = dp[i-1]+1;
}
if(dp[i]>ans){
ans = dp[i];
}
}
return ans;
}
};
三、718
动态规划的子序列系列问题,元素是连续的,所以DP状态转移公式是 +1,这题的特点是两个数组找共同子序列,所以DP数组是2维的,别的没什么了。
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
// 边界值处理
if(nums1.size() == 1 || nums2.size() == 1){
return 1;
}
// DP数组含义:以 i-1 和 j-1 结尾的数组,最大公共子序列是多长
vector<vector<int>> dp(nums1.size()+1, vector(nums2.size()+1, 0));
int ans = 0;
for(int i=1; i<=nums1.size(); i++){
for(int j=1;j<=nums2.size();j++){
if(nums1[i-1] == nums2[j-1]){
dp[i][j] = dp[i-1][j-1]+1;
}
if(dp[i][j] > ans){
ans = dp[i][j];
}
}
}
return ans;
}
};
总结
动态规划的子序列系列问题,感觉和之前的股票问题区别不是很大。