以前在数据结构的书上看过这么一种解法

for(int i=0; i<N; i++) {
    now_sum += A[i];
    if (now_sum > max_sum)
        max_sum = now_sum;
    else if (now_sum < 0)
        now_sum = 0;
}

但这种解法被我算法课的老师喷了,说这样看不出算法的思路。
而最大连续子列之和是dp(动态规划)问题,应该用先有动态规划的递推式再写程序。

但事实上标准的动态规划解法也是有一点tricky的,我们递推的实际上是

max_endwith[i]: 存A[0...i]中以A[i]结尾的最大连续子列之和

递推式是

max_endwith[i] = max(max_endwith[i-1] + A[i], A[i])

而我们真正想要的结果是

max_sum = max(max_endwith[0], max_endwith[1]..., max_endwith[n-1])

附上标准动态规划算法的python解法,在leetcode上AC了

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

wangdai
1k 声望18 粉丝