python----连续子序列最大和

#给定一个整数数组,找到一个具有最大和的子数组,返回其最大和

array=[1,3,5,7,-2,9,100]
array=[-2 ,6, -1, 5, 4, -7, 2, 3] 
res=array[0]
temp=0
if len(array)==0:
    print(res)
for i in range(len(array)):
    temp+=array[i]
    res=max(res,temp)
    if temp<0:
        temp=0
print(res)

动态规划:
时间复杂度o(N)
动态规划三要素:1.最优子结构、2.边界、3.状态转移方程
分析:
步骤1:
令dp[i]表示以A[I]作为结尾的连续子序列的最大和
步骤2:
因为dp[i]要求必须以A[I]结尾的连续序列,那么只有两种情况:
1.这个最大和的连续序列只有一个元素,即以A[I]开始,以A[I]结尾。
2.这个最大和的连续序列有多个元素,即以A[p]开始(p小于i),以A[i]结尾。
对于情况1,最大和就是A[i]本身
对于情况2,最大和是A[i-1]+A[i]
于是得到状态转移方程:
dp[i]=max{A[i],dp[i-1]+A[i]}
步骤3:
连续子序列和为:
maxsub[n]=max{dp[i]} (1<=i<=n)

def findmaxsub(array):
    if len(array)==0:
        return array[0]
    dp=res=array[0]
    for i in range(1,len(array)):
        dp=max(array[i],dp+array[i])
        res=max(dp,res)
    return res
if __name__=="__main__":
    array = [4,2,-4]
    print(findmaxsub(array))

猜你喜欢

转载自blog.csdn.net/haoshan4783/article/details/89205859
今日推荐