动态规划

博客主要探讨数组最大连续子序列和的求解。介绍了一般方法,通过两层循环依次计算连续和并找出最大值。还重点阐述了动态规划方法,指出其关键在于找出状态转移方程,根据前一个连续子和与 0 的大小关系,确定当前最大连续和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 连续子序列之和最大

给一个数组,返回它的最大连续子序列的和,例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。

1.1 一般方法:用两层循环

最大和变量:max_list = [ ]

从第0个位置6开始,依次往后计算连续和,并求出最大的和。6 ,3, 1 ,8, -7,-6,-4, -2 ;最大和为8,即max_list = [8]

第1个位置-3开始,依次往后计算连续和,并求出最大的和。 -3,-5, 2, -13, -12, -10, -8 ;最大和为2,即max_list = [8,2]

。。。

最后位置2,最大和为2,即max_list = [8,2,。。。2]

然后求出max_list中最大的元素,即为最大连续之和

但是在编码实现时,不是先求出中间值序列,再求最大值。而是一边计算连续序列,一边和最大值比较,如果比最大值大,就替换掉最大值。

class Solution:
    def FindGreatestSumOfSubArray(self, array):
        # write code here
        max_sum = array[0]
        for i in range(len(array)):
            max_tmp = 0
            for j in range(i,len(array)):
                max_tmp += array[j]
                if max_tmp > max_sum:
                    max_sum = max_tmp
        return max_sum

1.2 动态规划

动态规划最难的就是找出状态转移方程。

lis = [6,-3,-2,7,-15,1,2,2]

只有一个数6,最大连续和为6

6,-3 ,一眼看出是6。过程是,连续和是6+(-3)=3 ,3, 6, -3,比较,最大的是6

这里比较的三个数,抽象出来就是,连续子和,前一个最大数,当前数,这三个数比较就行了。

连续子和与当前数都是暂时的,最大数是两者比较出来的

如果前一个连续子和dp[i-1]<0,加上当前数A[i],只能更小,比A[i]还小,这样两者之间最大数就是A[i]

如果前一个连续子和dp[i-1]>=0,加上当前数A[i],只能更大,比A[i]还大或相等,这样两者之间最大数就是dp[i-1] + A[i]

这两种暂时的较大值赋值给max_tmp = max{dp[i-1]+A[i] , A[i]}

然后求max_tmp的最大值

class Solution:
    def FindGreatestSumOfSubArray(self, array):
        # write code here
        max_sum = array[0]
        max_tmp = 0
        for i in range(len(array)):
            if max_tmp>=0:
                max_tmp += array[i]
            else:
                max_tmp = array[i]
            if max_tmp > max_sum:
                max_sum  = max_tmp
        return max_sum

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值