1.递增最长子序列
- LeetCode链接
- 这里dp[i]的含义是nums[0]到nums[i-1] 在内的所有子序列的最长序列长度
- 只要想到每次遍历完的dp[i]的结果 后边都可以用即可
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int len = nums.size();
vector<int> dp(len, 1);
int result = 1;
for(int i=1; i<len; i++){
for(int j=0; j<i; j++){
if(nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
}
result = max(dp[i], result);
}
return result;
}
};
2. 最长连续递增序列
- LeetCode链接
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
int len = nums.size();
vector<int> dp(len, 1);
int result =1;
for(int i=1; i<len; i++){
if(nums[i] > nums[i-1]){
dp[i] = dp[i-1] + 1;
}
if(dp[i] > result) result = dp[i];
}
return result;
}
};
3. 最长重复子数组
- LeetCode链接
- 这里的 dp数据从 dp[1]开始记录, dp[i+1]记录的nums[i]的值
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums1.size()+1, vector<int>(nums2.size()+1, 0));
int result = 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] > result) result = dp[i][j];
}
}
return result;
}
};