本文主要是介绍Day 53 |● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1143.最长公共子序列
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size()+1,vector<int>(text2.size()+1,0));int res = 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;res = max(res,dp[i][j]);}else{dp[i][j] = max(dp[i-1][j], dp[i][j-1]);res = max(res,dp[i][j]);} }}return res;}
};
具体思路:
dp[i][j]:对text1的前 i 个长度和对text2的前 j 个长度所能得到的最大公共子序列长度。
因为描述的是长0度不是下标,所以在初始化的时候,dp初始化时候的大小,得加1。
而在推导中 dp[i][j] 的推导过程只会存在如下俩种情况,要么相等了,要么不相等。
相等:因为 ij代表的是长度,则很自然的,如果想表达前 2 个元素,比对的当前第2个元素下标是1,所以当相等,也就是 text1[i-1] == text2[j-1]的时候,那么此时当前dp[i][[j] 位置因为其相同,则一定能够在原先 dp[i-1][j-1]的基础上+1.
不相等:不相等则说明,不能加1,则说明俩个组合不能同时前进后退,而此时的值只能从俩者单独退一步所能获得的最大值来覆盖。
1035.不相交的线
跟上题一模一样
53. 最大子序和
class Solution {
public:int maxSubArray(vector<int>& nums) {if(nums.size() == 1) return nums[0];vector<int> dp(nums.size());dp[0] = nums[0];//注意初始化int res = dp[0];//注意初始化for(int i = 1; i < nums.size(); i++){dp[i] = max(dp[i-1] + nums[i], nums[i]);res = max(res, dp[i]);}return res;}
};
具体思路:
dp[i] : (0-i区间所能获得的最大连续子数组值)
dp[i]推导可以通过要么上一个dp[i-1]的值加上当前的值为大,要么直接以当前值为最大,因为若之前的值是负数,则肯定会导致相加变小,那么前面全部抛弃,直接从当前开始。
初始化也很重要,首先是dp[0],从0下标开始,则其值肯定就是nums[0]的值,而res初始化也得是0下标的值,以防万一一直就是负数,如果初始是0的话,0一直大于负数,但是其真正的最大值也就是负数,会导致出问题。
这篇关于Day 53 |● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!