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一直大于负数,但是其真正的最大值也就是负数,会导致出问题。

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值