动态规划

动态规划方法用于解决寻找数组中具有最大乘积的连续子数组问题。通过维护局部最优和全局最优,动态规划的解法涉及两个变量的更新。对于包含正负数的情况,需要同时维护局部最大值和最小值。给出的解决方案是一个Java实现的`maxProduct`函数,遍历数组并不断更新最大值和最小值,从而找到最大乘积。
摘要由CSDN通过智能技术生成

      用动态规划的方法,就是要找到其转移方程式,也叫动态规划的递推式,动态规划的解法无非是维护两个变量,局部最优和全局最优。其中局部最优的意思就是到目前这个数字为止,其最好的值,整体最优就是整体的最好值。

例子:

Maximum Product Subarray

 

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.


Product Subarray,要考虑到一种特殊情况,即负数和负数相乘:如果前面得到一个较小的负数,和后面一个较大的负数相乘,得到的反而是一个较大的数,如{2,-3,-7},所以,我们在处理乘法的时候,除了需要维护一个局部最大值,同时还要维护一个局部最小值,由此,可以写出如下的转移方程式:

max_copy[i] = max_local[i]
max_local[i + 1] = Max(Max(max_local[i] * A[i], A[i]),  min_local * A[i])

min_local[i + 1] = Min(Min(max_local[i] * A[i], A[i]),  min_local * A[i])


public class Solution {
    public int maxProduct(int[] A) {
        if(A.length<=0) return 0;  
        if(A.length==1) return A[0];  
        int curMax = A[0];  
        int curMin = A[0];  
        int ans = A[0];  
        for(int i=1;i<A.length;i++){  
            int temp = curMin *A[i];  
            curMin = Math.min(A[i], Math.min(temp, curMax*A[i]));  
            curMax = Math.max(A[i], Math.max(temp, curMax*A[i]));  
            ans = Math.max(ans, curMax);  
        }  
        return ans; 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值