O(nk)的dp就能解决
dp[n][j] 表示当最后一个数以第j种方式取时的最大值,其中j <= k
推广到每个i即可,
用pre[i]存储第i个数不同取法中的最大值
class Solution { public: int dp[550][550]; int pre[550]; int maxSumAfterPartitioning(vector<int>& arr, int k) { int n = arr.size(); memset(dp, 0, sizeof(dp)); memset(pre, 0, sizeof(pre)); dp[1][1] = arr[0]; pre[1] = dp[1][1]; for(int i = 2; i <= n; i++) { int tmp = -1; int max_v = -1; for(int j = 0; j < k; j++) { if(i >= j + 1) { max_v = max(max_v, arr[i - j - 1]); dp[i][j + 1] = pre[i - j - 1] + max_v * (j + 1); pre[i] = max(pre[i], dp[i][j + 1]); } else break; } } int max_ret = -1; for(int i = 1; i <= k; i++) max_ret = max(max_ret, dp[n][i]); return max_ret; } };