以前在数据结构的书上看过这么一种解法
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。