zoukankan      html  css  js  c++  java
  • dp related problems (update continuously)

    Leetcode Maximum Product Subarray

    这个问题是说给一个整数数组。求最大连续子阵列产品。

    纠结了包括阵列中的很长一段时间0而如何处理负数,关键的事实是,负治疗,所以我们录得最大正值和最小负值,这样就能够非常easy的处理负数的情况了。对于当前元素假设是负数,那么最大值可能是前面的最小负值乘以当前的负数;假设是正数,那么则非常有可能是前面的最大正值乘以当前正数。

    于是我们记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
            



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Eclipse下载
    RTT之AT命令组件
    RTT之shell
    RTT之内存管理及异常中断
    单片机的图形UI
    RTT学习
    RTT学习之线程管理
    C++学习笔记:
    运放
    关于KEIL下的图形化显示和输出问题
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4801941.html
Copyright © 2011-2022 走看看