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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值