美文网首页
动态规划(最大乘积连续子串和最大和连续子串)

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

作者: mylocal | 来源:发表于2017-08-07 11:08 被阅读0次
    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为局部最小值。由于乘积需要考虑正负的情况,即负负得正,因此需要记录局部最小值和局部最大值

    相关文章

      网友评论

          本文标题:动态规划(最大乘积连续子串和最大和连续子串)

          本文链接:https://www.haomeiwen.com/subject/rdmolxtx.html