classSolution { public: intsplitArray_DP(vector<int>& nums, int m){ // DP solution int n = nums.size(); vector<int> sum(n); sum[0] = nums[0]; for (int i = 1; i < n; ++i) sum[i] = sum[i-1] + nums[i];
vector<vector<int>> f(n, vector<int>(m+1, 0x7fffffff)); f[0][1] = nums[0]; for (int i = 1; i < n; ++i) { f[i][1] = f[i-1][1] + nums[i]; } for (int j = 2; j <= m; ++j) { for (int i = 0; i < n; ++i) { // int acc = nums[i]; // for (int k = i-1; k >= 0; --k) { // f[i][j] = min(f[i][j], max(f[k][j-1], acc)); // acc += nums[k]; // } int L = 0, R = i, M; while (L < R) { M = (L + R) >> 1; if (f[M][j-1] <= sum[i] - sum[M]) { L = M + 1; f[i][j] = min( f[i][j], max(f[M][j-1], sum[i] - sum[M])); } else { R = M; } } f[i][j] = min( f[i][j], max(f[L][j-1], sum[i] - sum[L])); } } return f[n-1][m]; }
intsplitArray(vector<int>& nums, int m){ // Divide the answer auto judge = [&nums, m](int limit) { int ret = 1; int acc = 0; for (int v : nums) { if (acc + v <= limit) { acc += v; } else { acc = v; ret += 1; } } // printf("limit=%d, groups=%d\n", limit, ret); return ret <= m; }; int L = 0, R = 0, M; for (int v : nums) { R += v; L = max(L, v); } int ret = 0; while (L <= R) { M = (L + R) >> 1; if (judge(M)) { ret = M; R = M - 1; } else { L = M + 1; } } return ret; } };