python算法总结(二):python实现最大子数组和(动态规划法)

一、动态规划法求最大字段和

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])

 

                   

 

你可能感兴趣的:(python基本算法)