# 1143.最长公共子序列 和718最长公共子数组 对比
本题可以不连续
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));
for (int i = 1; i <= text1.size(); i++) {
for (int j = 1; j <= text2.size(); j++) {
if (text1[i - 1] == text2[j - 1]) {
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()];
}
# 1035.不相交的线
其实和不连续的也就是子序列那道题 1143 一模一样
#53. 最大子序和
之前学贪心做过一次了。
int maxSubArray(vector<int>& nums) {
int result = INT_MIN;
int count = 0;
for (int i = 0; i < nums.size(); i++) {
count += nums[i];
if (count > result) {
result = count;
}
if (count <= 0) count = 0;
}
return result;
}
但是dp不要和贪心弄混了,dp不需要分累计和会不会<0,只用不断转移,取大就行. 加上了估计也不会错,就是没意义。
int maxSubArray(vector<int>& nums) {
vector<int> dp(nums.size());
for(int i=0;i<nums.size();i++) dp[i]=nums[i];
int res = dp[0];
for (int i = 1; i < nums.size(); i++) {
dp[i] = max(dp[i - 1] + nums[i], dp[i]);
res=max(res,dp[i]);
}
return res;
}
注意dp最后一个元素不是最大的:哪怕是subarray也不行。总结而言求和的不太行,求长度的一般都可以取dp最后一个