看题目给的提示,设置dp为当截止当前元素,可以通过分割subarray来得到的最大值。dp[i]代表以A[i]为结尾的subarry以及subarray之前无论怎么分割,所得到的加和结果。则以j代表subarray的长度。j取值[1, min(k, i+1)]
class Solution:
def maxSumAfterPartitioning(self, arr: List[int], k: int) -> int:
N = len(arr)
if N <= k:return N*max(arr)
dp = [0]* N
for i in range(N):
cur_sub_max = 0
for j in range(1, min(k, i+1)+1): #i+1 is the length of subarray in the condition that i is smaller than k, in which the subarray length is smaller than k
cur_sub_max = max(cur_sub_max, arr[i-j+1])
dp[i] = max(dp[i], dp[i-j]+cur_sub_max*j)
return dp[-1]