Python|最大子序和

Posted 算法与编程之美

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python|最大子序和相关的知识,希望对你有一定的参考价值。

前言

最大字序和的思想用到了动态规划思想,本文章通过最大字序和例子来简单解释动态规划思想。

动态规划指的是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推的方式去解决,就是将待求解的问题分解成未知个小问题,然后按照顺序求解小问题,前面解决的问题为后面一个问题的求解提供了有用的信息。

动态规划的大致思路;

首先拆分问题,根据问题的可能性把问题划分成一步一步这样就可以通过递推或者递归来实现。

前面拆分的步骤之间的关系,用一种看得见的形式表现出来,就像高中学的推导公式。

输出最优解


问题描述

给出一个整数数组 nums ,找到一个具有最大和的连续子数组返回其最大和。比如说[-2,1,-3,4,-1,2,1,-5,4],找出的最大字序和为6,分别由数组中的[4,-1,2,1]中的数相加

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

输出:6


解决方案

对于数组求最大字序和的问题,我们先再给一个数组a来记录相加或者不变的状态,a[i]就为以nums[i]结尾的连续子数组最大和。首先我们先把数组a初始化为n个为o的列表,a = [0] * n,依次计算nums的长度,如果nums长度为1,则就把nums中的第一个元素与a列表中的第一个元素相加,结果就为[-2, 0, 0, 0, 0, 0, 0, 0, 0],再遍历1到n的数记为i,此时我们加入a[i-1]来与nums[i]形成联系,就好比上一个问题的解为下一个问题的解提供了有效的信息,我们再对a[i-1]进行判断,如果a[i-1]<0的话,那么此时a[i]就等于nums[i],就是在遍历出i时,我们查找a[i-1],开始i=1此时a[i-1]==-2<0,所以为负数就不进行相加,nums[i]==1,所以a[i]=nums[i]=1,如果a[i-1]>0,那么就要进行相加,例如当i=2时,a[1]==1>0,nums[2]==-3,则此时a[i]=a[i-1]+nums[i],所以就得到了a[2]=1+(-3)=-2此时a列表为[-2,1,-2, 0, 0, 0, 0, 0, 0],后面依次类推就可以得到[-2, 1, -2, 4, 3, 5, 6, 1, 5],这是a列表,其中最大的就为6,分别由连续四个[4,-1,2,1]相加得出的。


结语

本文章对动态规划思想进行了大致的解释,并用最大子序和来对动态规划思想进行了更好的阐述,不足就是在进行算法描述时不是很清楚,用了类比推理的思想,所以读者要更好地理解的话可能要在电脑上调试代码。

附件

最大子序和问题python代码

nums =  [-2,1,-3,4,-1,2,1,-5,4]

n = len(nums)

if n == 1:

    print(nums[0])

# a[i] 为以 nums[i] 结尾的连续子数组最大和

a = [0] * n   # 初始化a数组为 n 0 的列表

a[0] = nums[0]   #a列表中第一个元素为nums中的第一个元素

# 遍历每一位

for i in range(1,  n):

    # a[i-1]即以 nums[i-1] 结尾的子数组最大和

    # 如果a[i-1] 非正,则不加

    if a[i - 1] <= 0:

        a[i] = nums[i]

    # 如果正,则加起来

    else:

        a[i] = a[i - 1] + nums[i]

print(a)  #打印出a列表

print(max(a))  # 打印出a列表的最大值

 




实习编辑:衡辉

稿件来源:深度学习与文旅应用实验室(DLETA)

以上是关于Python|最大子序和的主要内容,如果未能解决你的问题,请参考以下文章

Python|贪心算法解最大子序和

53最大子序和.py

TYVJ1305 最大子序和

最大子序和(数组模拟单调队列)

1.(53)最大子序和

53.最大子序和