300.最长递增子序列
300. Longest Increasing Subsequence(英文力扣连接)
知识点:动规
状态:不会
思路:
dp为取到i时的最长序列数字
dpi的值取决于前面比他小的数字(dpj)+1;并实时更新最大值
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size() ==1 ) return 1;
vector<int> dp(nums.size(), 1);// 结尾取到i时的最递增序列数字
int res = 0;
for(int i = 1; i < nums.size(); i++) {
for(int j = 0; j < i; j++) {
if( nums[j] < nums[i]) {
dp[i] =max(dp[j] + 1 , dp[i]) ;
// 是比前面任何一个位置的数大,就更新dpi=dpj +1 ;
}
if (dp[i] > res) res= dp[i];
//最大值不一定是最后面的,所以要实时更新
}
}
return res ;
}
};
674.最长连续递增序列
674. Longest Continuous Increasing Subsequence(英文力扣连接)
知识点:动规
状态:看思路ok
思路:
是连续递增,只需要考虑前一个,而不是前面的每一个
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
vector<int> dp(nums.size(), 1);
if(nums.size() == 1) return 1;
int res = 0;
for(int i = 1; i < nums.size(); i++) {
if(nums[i-1] < nums[i]) dp[i]=dp[i-1]+1;
res = max(res, dp[i]);
}
return res;
}
};
718.最长重复子数组
718. Maximum Length of Repeated Subarray(英文力扣连接)
知识点:动规
状态:不会
思路:
dp[i][j]是指nums1[i-1]和nums2[j-1]为结束的长度,如果说dp[i][j]是指nums1[i]和nums2[j]为结束的话,不好初始化,因为需要比较每一个i和j相不相同;
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0 ));
// dp[i][j]是指nums1[i-1]和nums2[j-1]为结束的长度
int res= 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;
res =max(res, dp[i][j]);
}
}
return res;
}
};