題目如下:
Given an integer array
A
, you partition the array into (contiguous) subarrays of length at mostK
. After partitioning, each subarray has their values changed to become the maximum value of that subarray.Return the largest sum of the given array after partitioning.
Example 1:
Input: A = [1,15,7,9,2,5,10], K = 3 Output: 84 Explanation: A becomes [15,15,15,9,10,10,10]
Note:
1 <= K <= A.length <= 500
0 <= A[i] <= 10^6
解題思路:假設dp[i][j] 表示第i個元素爲第j個子數組的最後一個元素時,A[0:i]可以獲得的最大值。那麼有dp[i][j] = max(dp[i][j], dp[m][j-1] + max_val[m+1][i] * (i-m)) ( i-k < m < i) 。
代碼如下:
class Solution(object): def maxSumAfterPartitioning(self, A, K): """ :type A: List[int] :type K: int :rtype: int """ import math dp = [] max_val = [] sub = int(math.ceil(float(len(A))/K)) for i in A: dp.append([0] * sub) max_val.append([0]*len(A)) for i in range(len(A)): max_val[i][i] = A[i] for j in range(i+1,len(A)): max_val[i][j] = max(max_val[i][j-1],A[j]) dp[0][0] = A[0] for i in range(len(A)): for j in range(sub): #print i,j if i-K< 0: dp[i][j] = max(A[0:i+1]) * (i+1) else: for m in range(i-K,i): dp[i][j] = max(dp[i][j], dp[m][j-1] + max_val[m+1][i] * (i-m)) #print dp return dp[-1][-1]
轉載於:https://www.cnblogs.com/seyjs/p/11044749.html