最大递增子序列
dp[i] 代表从第0个数据到第i个数据,最大的子序列。
只是在递推的时候,需要使用两层for循环。因为每次求dp[i],都需要和前面每一个dp的状态进行对比。
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size(), 1);
for(int i = 1; i < nums.size(); i++){
for(int j = 0; j < i; j++){
if(nums[i] > nums[j])
dp[i] = max(dp[j] + 1, dp[i]);
}
}
int result = 1;
for(auto i : dp)
result = max(i, result);
return result;
}
最大连续递增子序列
比上一个题目要简单些,因为是连续,所以只需要一层循环。
int findLengthOfLCIS(vector<int>& nums) {
vector<int> dp (nums.size(), 1);
for(int i = 1; i < nums.size(); i++){
if(nums[i] > nums[i - 1])
dp[i] = dp[i - 1] + 1;
}
int result = 1;
for(auto i : dp){
result = max(result, i);
}
return result;
}
最长重复子数组
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums1.size() + 1, vector<int> (nums2.size() + 1));
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;
}
}
int result = -1;
for(int i = 1; i <= nums1.size(); i++){
for(int j = 1; j <= nums2.size(); j++){
result = max(result, dp[i][j]);
}
}
return result;
}