动态规划(最大乘积连续子串和最大和连续子串)

  1. Maximum Subarray:https://leetcode.com/problems/maximum-subarray/description/
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<int> dp(n);
        dp[0]=nums[0];
        int max=nums[0];
        for(int i=1;i<n;i++){
            dp[i]=nums[i]+(dp[i-1]>0?dp[i-1]:0);
            max=max>dp[i]?max:dp[i];
        }
        return max;
    }
};

dp存储局部最优值,即到i位置的最大和
max为全局最优值(不应从前缀和的角度考虑,应考虑正负)

  1. Maximum Product Subarray: https://leetcode.com/problems/maximum-product-subarray/description/
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n=nums.size();
        vector<int>first(n);
        vector<int>last(n);
        first[0]=nums[0];
        last[0]=nums[0];
        for(int i=1;i<n;i++){
            first[i]=max(max(nums[i],nums[i]*first[i-1]),nums[i]*last[i-1]);
            last[i]=min(min(nums[i],nums[i]*first[i-1]),nums[i]*last[i-1]);
        }
        int m=nums[0];
        for(int i=0;i<n;i++){
            m=max(m,first[i]);
        }
        return m;
    }
};

first为局部最大值,last为局部最小值。由于乘积需要考虑正负的情况,即负负得正,因此需要记录局部最小值和局部最大值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,349评论 0 33
  • Maximum Product Subarray 标签(空格分隔): algorithm 涉及到公式请到作业部落查...
    别时茫茫阅读 5,174评论 0 0
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 18,080评论 2 36
  • Maximum Subarray 由于简书不支持latex语法,所以可以到下面的作业部落去看。https://ww...
    别时茫茫阅读 7,030评论 0 2
  • 吵架的时候我们都不要说狠话。 余生那么长,我们不可避免的会产生分歧与矛盾,但如果我们吵架,我希望是为了把隐藏的情绪...
    牧岩阅读 4,643评论 0 1