当前位置 博文首页 > 中流击水,浪遏飞舟:动态规划&&剑指 Offer 42. 连续子

    中流击水,浪遏飞舟:动态规划&&剑指 Offer 42. 连续子

    作者:[db:作者] 时间:2021-08-26 12:45

    1.动规关键:状态转移方程式

    2.此题二维数组动规,会超时

    3.一维数组动规如下:

    dp[i]=nums[i]+(dp[i-1]>0?dp[i-1]:0);
    dp[i]代表以nums[i]结尾的最大连续子数组和,dp[i-1]小于0会带来比nums[i]还要小的负收益,故dp[i-1]大于0时,dp[i]才会加上dp[i-1]。

    class Solution {
    public:
        //动态规划
        int maxSubArray(vector<int>& nums) {
            int length=nums.size();
            vector<int> dp(length+1,0);
            int ans=nums[0];
            dp[0]=nums[0];
            int i=1;
            while(i<length){
                dp[i]=nums[i]+(dp[i-1]>0?dp[i-1]:0);
                ans=max(ans,dp[i]);
                i++;
            }
            for(int i=0;i<=length;i++){
                cout<<dp[i]<<" ";
            }
            return ans;
        }
    };
    

    4.优化:两个变量记录动规

    class Solution {
    public:
        //动态规划
        int maxSubArray(vector<int>& nums) {
            int pre=0,ans=nums[0];
            for(auto i:nums){
                pre=max(pre+i,i);
                ans=max(ans,pre);
                cout<<ans<<" ";
            }
            return ans;
        }
    }
    
    cs