题目来源于:https://leetcode.com
410. Split Array Largest Sum
- Total Accepted: 10225
- Total Submissions: 28967
- Difficulty: Hard
- Contributor: LeetCode
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)
题解:
int splitArray(vector<int>& nums, int m) {
int sz = nums.size();
std::vector<std::vector<int>> dp(m, std::vector<int>(sz, 0));
std::vector<int> acc(sz);
acc[0] = nums[0];
dp[0][0] = acc[0];
for (int i = 1 ; i < sz ; ++i) {
acc[i] = acc[i - 1] + nums[i];
dp[0][i] = acc[i];
}
for (int i = 1 ; i < m ; ++i) {
for (int j = i ; j < sz ; ++j) {
int local = INT_MAX;
for (int k = i - 1 ; k < j ; ++k) {
int test = std::max(dp[i - 1][k],
acc[j] - acc[k + 1] + nums[k + 1]);
if (test < local) {
local = test;
}
}
dp[i][j] = local;
}
}
return dp[m - 1][sz - 1];
}