leetcode 410 动态规划版本,dp[i][j]表示到i为止,分割为j组的最小最大和。
class Solution {
public:
int splitArray(vector<int>& nums, int m) {
int n = nums.size();
vector<vector<long>> dp(n+1, vector<long>(m+1, ~(1<<31)));
vector<long> sums(n+1, 0);
// nums.push_front(0);
for(int i=1; i<=n; ++i) sums[i] = sums[i-1] + nums[i-1];
for(int i=0; i<=n; ++i) dp[i][1] = sums[i]; // 到i为止,只分一组。
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
for(int k=0; k<=i; ++k){ // 枚举到i为止所有切割点。
dp[i][j] = min(dp[i][j], max(dp[k][j-1], sums[i]-sums[k]));
}
}
}
return dp[n][m];
}
};