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:
long splitArray(vector<int>& nums, int m)
{
int n = nums.size();
sum = vector<long>(n,0);
sum[0] = nums[0];
mem = vector<vector<long>>(n,vector<long>(m+1,INT_MAX));
for(int i=1;i<n;i++)
{
sum[i] = sum[i-1] + nums[i];
}
return splitarray(nums,n,m);
}
private:
vector<long> sum;
vector<vector<long>> mem;
long splitarray(vector<int>& num,int n ,int m)
{
for(int i=0;i<n;i++)
for(int j=1;j<=i+1&&j<=m;j++)
if(j==1) mem[i][j] = sum[i];
else
for(int k=0;k<i;k++) mem[i][j] = min(mem[i][j],max(mem[k][j-1],sum[i]-sum[k]));
return mem[n-1][m];
}
};