#给定一个整数数组,找到一个具有最大和的子数组,返回其最大和
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))