动态规划
class Solution:
def maxSumAfterPartitioning(self, arr, k) -> int:
size = len(arr)
dp = [0] * size
dp[0] = arr[0]
for i in range(1, size):
cnt = 0
maxv = 0
j = i
while j >= 0:
cnt += 1
if cnt > k:
break
if maxv < arr[j]:
maxv = arr[j]
if j:
dp[i] = max(dp[i], cnt * maxv + dp[j - 1])
else:
dp[i] = max(dp[i], cnt * maxv)
j -= 1
return dp[size - 1]
dp[i]的状态表示:数组到i为止最大的和
每次遍历i中另设一个指针j指向i,表示当前选择的小于k个子数组的大小为j到i,当范围超过k时结束,每次遍历j时更新dp[i]的值为最大值