300.最长递增子序列
动规五部曲:
- dp[i]: 表示考虑元素i的最长子序列为dp[i]
- 递推公式:dp[i] = max(dp[j] + 1, dp[i]);
- 初始化:dp[i] = 1; 每个元素单独算一个子序列长度为1
- 遍历顺序:从前向后遍历
- 打印dp数组
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
// dp[i] 表示考虑i元素最长子序列是dp[i]
vector<int> dp(nums.size(), 1);
// 递推公式:dp[i] = max(dp[j] + 1, dp[i]);
// 初始化
dp[0] = 1;
int max_val = 1; // 用来记录最长的序列,因为最长的序列长度可能维护在任意一个位置
for(int i = 0; i < nums.size(); ++i) {
for(int j = 0; j < i; ++j) {
if(nums[j] < nums[i]) dp[i] = max(dp[j] + 1, dp[i]);
max_val = max(dp[i], max_val);
}
}
for(int val : dp) cout << val << " ";
return max_val;
}
};
674.最长连续递增序列
思路:只要nums[i-1] < nums[i]则dp[i] = dp[i-1] + 1;
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
// dp[i]: 表示考虑i元素的最长连续递增子序列为dp[i]
vector<int> dp(nums.size(), 1);
// 递推公式dp[i] = dp[i - 1] + 1;
// 初始化dp[i] = 1;
int max_val = 1;
// 遍历
for(int i = 1; i < nums.size(); ++i) {
if(nums[i] > nums[i - 1]) dp[i] = dp[i-1] + 1;
max_val = max(dp[i], max_val);
}
for(int val : dp) cout << val << " ";
return max_val;
}
};
718.最长重复子数组
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
// dp[i][j]: 表示nums1的i-1位置和nums2的j-1位置的最长重复子数组的长度
vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
// 递推公式:if(nums1[i] == nums2[j]) dp[i][j] = dp[i-1][j-1] + 1;
// 初始化:因为dp[i][j] 只依赖于dp[i-1][j-1]和其他位置,而长度又是从0开始累加的,所以均初始化为0
int max_len = 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;
max_len = max(max_len, dp[i][j]);
}
}
for(auto vec : dp) {
for(int val : vec) cout << val << " ";
cout << endl;
}
return max_len;
}
};
标签:val,nums,300,max,随想录,第四十九,int,vector,dp
From: https://www.cnblogs.com/cscpp/p/18282689