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];
    }
};