问题描述
给定一个数组,有正有负,乱序,要求找两个不重叠的子数组,使得这两个子数组元素的和最大。(一个子数组内元素下标是连续的。)
输入:[-3,1,2,3,-1,2,8,0,-1,-6,9,2]
输出:26
算法
正向和逆向两次动态规划,构建两个dp数组,保存从左(右)到当前元素的子数组和。
代码
def getMaxTwoArraySum(nums):
# type nums: List[int]
n=len(nums)
dp=[0 for i in range(n)]
dp_reverse=[0 for i in range(n)]
dp[0]=nums[0]
dp_reverse[n-1]=nums[n-1]
for i in range(1,n):
if dp[i-1]>0:
dp[i]=dp[i-1]+nums[i]
else:
dp[i]=nums[i]
if dp_reverse[n-1]>0:
dp_reverse[n-i-1]=dp_reverse[n-1]+nums[n-i-1]
else:
dp_reverse[n-i-1]=nums[n-i-1]
# 打印正向dp数组
for i in range(n):
print(dp[i],end=' ')
print()
# 打印逆向dp数组
for i in range(n):
print(dp_reverse[i],end=' ')
print()
# 将dp数组的值替换为从左(右)开始到当前位置最大的子数组之和
for i in range(1,n):
dp[i]=max(dp[i],dp[i-1])
dp_reverse[n-i-1]=max(dp_reverse[n-i-1],dp_reverse[n-i])
max_sum=0
for i in range(1,n-1):
sum=dp[i]+dp_reverse[i+1]
max_sum=max(sum,max_sum)
return max_sum
测试用例
def main():
nums=[-3,1,2,3,-1,2,8,0,-1,-6,9,2]
print(getMaxTwoArraySum(nums))
main()