刷了也有一些Leetcode题了,发现动态规划类得题目,大多数都属于中等难度。然而关于动态规划思路之前也一直没琢磨透,今天就来尝试一道动态规划题。
一、先介绍题目背景
给你一个整数数组 arr 和一个整数 k。
首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次。
举个例子,如果 arr = [1, 2] 且 k = 3,那么修改后的数组就是 [1, 2, 1, 2, 1, 2]。
然后,请你返回修改后的数组中的最大的子数组之和。
注意,子数组长度可以是 0,在这种情况下它的总和也是 0。
由于 结果可能会很大,所以需要 模(mod) 10^9 + 7 后再返回。
二、介绍下思路解法
刷多了Leetcode算法题得同学,应该也能一眼看出这种求最大子数组,最大连续元素就是属于很典型得动态规划题目,可以考虑使用动态规划得思路来解题。
那么现在就来详细讲讲动态规划得一个解题思路,其实网上很多内容说的都挺复杂得,对于动态规划大家其实只需要记得,时刻将极值(最大,或者最小值)给保存下来,用一个dp_list存储。例如:【1,3,-1,-2,5】,求最大子数组,那么对应得dp_list为【1+3,1+3-1, 1+3-2, 1+3-1-2+5】,因为这里设置了只要和大于0,则将结果存入dp_list。下面大家可以看看这Leetcode得代码,也可以更加深入得了解动态规划得含义
三、代码过程
def kConcatenationMaxSum(arr, k) -> int:
"""
如果dp_list的前一个元素 + arr的这个元素大于0,因为只要大于0,那么加上arr后面的元素,就有可能更大;如果小于0,那么再加后面的元素,只会更小,则用0代替,从新开始求和。
"""
arr = arr * k
# dp_list存储求和结果
dp_list = [0] * (len(arr)+1)
for i in range(len(arr)):
if dp_list[i-1] + arr[i] >= 0:
dp_list[i] = dp_list[i-1] + arr[i]
else:
dp_list[i] = 0
return max(dp_list)