一、动态规划法求最大字段和
1、基本思路
设数组为listd[],设maxsum[i]为以listd[i]结尾的子数组的最大和,对于元素listd[i + 1],只有两种选择:
(1)listd[i + 1]接着前面的子数组构成最大和。
(2)listd[i + 1]自己单独构成子数组。
则,动态规划状态转移方程为maxsum[i + 1] = max{maxsum[i] + listd[i + 1],listd[i + 1]}。
2、for循环中要实现的逻辑:
如果 (以前最大子数组 >= 0):
以前最大子数组和 + 当前数组元素 = 当前最大子数组和
否则:
当前最大子数组和 = 当前数组元素
记录开始坐标
如果 (最大和 < 当前最大子数组 ):
最大和 = 当前最大子数组和
记录结束坐标
3、代码实现
def sumd(listd):
maxdata = 0
sumdata = 0
begin = 0
right = 0
for i in range(0, len(listd) - 1):
if (sumdata >= 0):
sumdata = sumdata + listd[i]
else:
sumdata = listd[i]
begin = i
if (maxdata < sumdata):
maxdata = sumdata
right = i
print(maxdata)
print(listd[begin:right])
sumd([-1, 2,3,-3,4,5,-6])