dp related problems (update continuously)

来源:互联网 发布:普希金怎么死的 知乎 编辑:程序博客网 时间:2024/05/22 19:32

Leetcode Maximum Product Subarray

这道题是说给一个整数数组,求最大的连续子数组的乘积。纠结了好久数组中包含0和负数怎么处理,其实关键就是负数的处理,于是我们记一个最大正值和最小负值,这样就可以很容易的处理负数的情况了。对于当前元素如果是负数,那么最大值可能是前面的最小负值乘以当前的负数;如果是正数,那么则很有可能是前面的最大正值乘以当前正数。

于是我们记dpp[i]为以第i个数结尾的最大正值,dpn[i]表示以第i个数结尾的最小负值,那么就有下面的两种更新情况:

if A[i] > 0:

  dpp[i] = max(A[i], dpp[i-1]*A[i])

  dpn[i] = min(0, dpn[i-1]*A[i])

if A[i] < 0:

  dpn[i] = min(A[i], A[i]*dpp[i-1])

  dpp[i] = max(0, A[i]*dpn[i-1])

并且在遍历的过程中用dpp[i]更新最终的结果值就行了,具体可参考下面的代码。

class Solution:    # @param A, a list of integers    # @return an integer    def maxProduct(self, A):        if A == None:            return 0        if len(A) == 0:            return 0        if len(A) == 1:            return A[0]                dpp = [0]*len(A)        dpn = [0]*len(A)                ans = A[0]        if A[0] > 0 :            dpp[0] = A[0]        elif A[0] < 0 :            dpn[0] = A[0]                    for i in range(1, len(A)):            if A[i] == 0 :                continue            elif A[i] > 0 :                 dpp[i] = max(A[i], A[i]*dpp[i-1])                dpn[i] = min(0, A[i]*dpn[i-1])            else:                dpn[i] = min(A[i], A[i]*dpp[i-1])                dpp[i] = max(0, A[i]*dpn[i-1])            ans = max(dpp[i], ans)        return ans        



1 0
原创粉丝点击