心得
题解
- 考虑字符不等情况下,各自往前移一位的情况,求最值即可,而且返回直接dp末尾值即为最大(主要由于所有情况都考虑到了,因此dp末尾元素一定最大,由上左前递推而来,同时也保证遍历顺序直接先上后下,先左后右)
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
if (text1.size() == 0 || text2.size() == 0) return 0
vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0))
for (int i = 1
for (int j = 1
if (text1[i - 1] == text2[j - 1]) {
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1)
} else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
}
}
}
return dp[text1.size()][text2.size()]
}
}
心得
题解
- 竟然求的就是最长公共子序列,被秀到了,代码完全一致,套壳
class Solution {
public:
int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() == 0 || nums2.size() == 0) return 0
vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0))
for (int i = 1
for (int j = 1
if (nums1[i - 1] == nums2[j - 1]) {
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1)
} else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
}
}
}
return dp[nums1.size()][nums2.size()]
}
}
心得
题解
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 0) return 0
vector<int> dp(nums.size(), 0)
int result = nums[0]
dp[0] = nums[0]
for (int i = 1
dp[i] = max(dp[i - 1] + nums[i], nums[i])
if (dp[i] > result) result = dp[i]
}
return result
}
}