代码随想录 DAY53

这个题首先初始化的时候一定是 .size()+1 因为到了.size()的时候 还要再加一位 这样才对

另外你这个思路一定要对 它是重叠不是加 也就是初始化的初值应该是0

其实本质上感觉你还是对于动态规划的数组的定义理解的不到位

vector<vector<int>> dp (text1.size()+1,(text2.size()+1,0));

这里定义的时候还是有些问题的 

你应该定义成vector<vector<int>> dp (text1.size()+1,vector <int>(text2.size()+1,0));

还有就是你在遍历的时候也是要遍历到tex1.size()+1 而不是到结尾就完了 你还要再去多遍历一位!!!!!

class Solution {

public:

    int longestCommonSubsequence(string text1, string text2) {

            vector<vector<int>> dp (text1.size()+1,vector<int>(text2.size()+1,0));

            int result =0;

            if(text1.size()==1&&text2.size()==1 && text1==text2)

                return 1;

            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],max(dp[i][j-1],dp[i-1][j-1]));

                    if(dp[i][j]>result)

                        result=dp[i][j];

                }

            }

            return result;

        }

    

};

class Solution {

public:

    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {

        vector<vector<int>> dp(nums1.size()+1,vector<int>(nums2.size()+1,0));

        int result=0;

        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;

                else

                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

                

            }

        }

        return dp[nums1.size()][nums2.size()];

    }

};

这个第二题几乎一模一样 但是你还是要注意  比较的时候是比较nums1[i-1]和nums2[j-1] 因为不这样的话会越界!!! 因为你毕竟是假设元素多一个 你可以想想两个字符串如果是完全相同的情况下 要+1

class Solution {

public:

    int maxSubArray(vector<int>& nums) {

        int result=nums[0];

        if(nums.size()==1)

            return nums[0];

        vector<int>dp(nums.size(),0);

        dp[0]=nums[0];

        for(int i=1;i<nums.size();i++){

            

            dp[i]=max(nums[i],dp[i-1]+nums[i]);

            if(dp[i]>result)

                result=dp[i];

        }

        return result;

    }

};

这个题明显用动态规划后就好很多了 就是再去注意两个点 

1 result需要初始化为dp[0] 不然的话 第二个元素第一次比较的时候就会错 因为你这个循环是不比较第一个元素的 

2 dp[0]要初始化为nums[0] 因为你的dp是依赖于dp[i-1]的  其实你犯的是同样的错误 也就是你不知道这个循环其实是跳过第一轮的 因此有错误

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值