用动态规划求解最大子数组问题
想了解如何用蛮力枚举、优化枚举、分治法求解可见我的博客用分治法求解最大子数组问题
动态规划:
import copy
def Max_Continuous_Subarray_DP(X,n):
"""
:param X: 输入的原始数组
:param n: 数组长度
:return: 最大子数组和Smax,子数组起始位置l,r
"""
# 初始化
D = copy.deepcopy(X)
Rec = [None for _ in range(n + 1)]
Rec[n] = n
# 动态规划
for i in reversed(range(0, n)):
if D[i] > 0:
D[i - 1]=X[i - 1]+D[i]
Rec[i]=Rec[i + 1]
else:
D[i - 1]=X[i - 1]
Rec[i]=i
# 查找解
Smax = D[0]
for i in range(1,n):
if Smax < D[i]:
Smax = D[i]
l=i + 1
r=Rec[i + 1]
return f"最大子数组和:{Smax},起始位置:{l},终止位置:{r}"
if__name__='__main__':
X=[1, -2, 4, 5, -2, 8, 3, -2, 6, 3, 7, -1]
print(Max_Continuous_Subarray_DP(X,len(X) - 1))