动态规划-leetcode#152-乘积最大子数组

class Solution {
public:
    int maxProduct(vector& nums) {
        if(nums.empty()) return 0;
        long max_res=INT_MIN;
        for(int i=0;i=0;j--){
                tmp*=nums[j];
                if(tmp>one) one=tmp;
            }
            max_res = max(max_res,one);
        }
        return max_res;
    }
};

先写了一个最挫的,找出i-j之间的乘积,对于以i结尾的串,取这其中最大的,然后max就是取所有i结尾最大的。

动态规划:

一开始想到dp[i]=max{dp[i-1]*nums[i],nums[i]},但是有问题,比如[-2,3,-4],在i=1时,dp[1]=3,因为-2*3=-6,3大于-6,所以取3,当i=2时,3*-4=-12,所以取-4,显然是错误的,应该是-2*3*-4可以得到最优解,24。因此需要存一下,当前i的最大最小:

i=0时: dp_max[0]=-2;dp_min[i]=-2;全局max=-2;

i=1时:dp_max[i-1]*3=-6,dp_min[i-1]*3=-6,nums[i]=3 ;则dp_max[1]=3,dp_min[1]=-6;全局max=3;

i=2时:dp_max[i-1]*-4=-12,dp_min[i-1]*-4=24,nums[i]=-4 ;则dp_max[1]=24,dp_min[1]=-12;全局max=24;

class Solution {
public:
    int maxProduct(vector& nums) {
        if(nums.empty()) return 0;
        vector dp_max(nums),dp_min(nums);
        dp_max[0]=nums[0];
        dp_min[0]=nums[0];
        int max_res=dp_max[0];
        for(int i=1;i

初始化一定要做好,全局max_res初始为第0个元素,当只有一个元素时候,不会进入循环,直接返回,所以不能初始化为INT_MIN。

动态规划优化存储空间:

其实不需要存所有的max和min,只需要存上一阶段的就可以。

class Solution {
public:
    int maxProduct(vector& nums) {
        if(nums.empty()) return 0;
        int dp_max=nums[0];
        int dp_min=nums[0];
        int max_res=dp_max;
        for(int i=1;i

循环体里面需要先计算cur_max和cur_min,而不能就地更新,因为更新完dp_max后面计算dp_min时会使用更新后的 dp_max,这显然是错误的。提交后发现前后内存并没有节省多少[尴尬]。动态规划-leetcode#152-乘积最大子数组_第1张图片

你可能感兴趣的:(动态规划DP,leetcode)