Maximum Subarray【python】

class Solution:
    # @param A, a list of integers
    # @return an integer
    def maxSubArray(self, A):
        dp=[]
        for i in range(len(A)):
            if i==0:
                dp.append(A[i])
            else:
                dp.append(max(A[i],A[i]+dp[i-1]))
        return max(dp)

if __name__=='__main__':
    s=Solution()
    A=[-32,-54,-36,62,20,76,-1,-86,-13,38,-58,-77,17,38,-17,43,32,-88]
    print(s.maxSubArray(A))

 说明:给定一个序列,求出和最大的连续子序列;例如,给定序列[−2,1,−3,4,−1,2,1,−5,4],连续子序列[4,−1,2,1]在所有子序列中有最大的和6.

如果只是求出最大值而不需要知道是哪个子序列,那么上面的代码就可以了。

dp[i]保存的是第i个项的最优值(这样描述可能不确切);当执行到底A[i]时,就要考虑要不要把A[i]加入到A[i-1]所在的subarray里面去,以(加入后这个SubArray的sum)大 还是 (不加入时单独的A[i]值)大 为选择标准。若选后者,那么A[i]就作为新的SubArray的第一项。

递推式是dp[i] = max( A[i] , A[i]+dp[i-1] )

有人不用dp[]这么一个表,而是用maxSum和localSum来代替记录。

时间代价是O(n),对效率有要求的情况下,还有一个采用分治的方法,有空补上。

你可能感兴趣的:(python)