Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays.
Note:
If n is the length of array, assume the following constraints are satisfied:
- 1 ≤ n ≤ 1000
- 1 ≤ m ≤ min(50, n)
Examples:
Input: nums = [7,2,5,10,8] m = 2 Output: 18 Explanation: There are four ways to split nums into two subarrays. The best way is to split it into [7,2,5] and [10,8], where the largest sum among the two subarrays is only 18.
class Solution {
public:
int splitArray(vector<int>& nums, int m) {
int len = nums.size();
vector<long long> sum(len, 0);
vector<vector<long long> > dp(m, vector<long long>(len, 0));
sum[0] = nums[0];
for(int i = 1; i < len; i++)
sum[i] = sum[i - 1] + nums[i];
for(int i = 0; i < m; i++){
for(int j = 0; j < len; j++){
dp[i][j] = i == 0 ? sum[j] : dp[i - 1][j];
if(i > 0){
for(int k = j - 1; k >= 0; k--){
dp[i][j] = min(dp[i][j], max(dp[i - 1][k], sum[j] - sum[k]));
}
}
}
}
return dp[m - 1][len - 1];
}
};
和813. Largest Sum of Averages一样的动态规划思路。比二分查找耗时很多