This question is the same as
Allocate BooksWe can use DP. dp[k][n] = min( max(dp[k - 1][j], sum(j, n)) ) for 1 < j < n
Solution:
Time: O(k * n ^ 2)
Space: O(k * n)
public class Solution {
public int paint(int A, int B, ArrayList<Integer> C) {
List<Integer> list = C;
long minMaxTime = paritition(list, A);
return (int) ((minMaxTime * B) % 10000003);
}
private long sum(List<Integer> list, int from, int to) {
long sum = 0;
for (int i = from; i <= to; i ++) {
sum += list.get(i);
}
return sum;
}
// dp[k][n] = min( max(dp[k - 1][j], sum(j, n)) ) for 1 < j < n
private long paritition(List<Integer> list, int k) {
int n = list.size();
long[][] dp = new long[k + 1][n + 1];
// k = 1
for (int i = 1; i <= n; i ++) {
dp[1][i] = sum(list, 0, i - 1);
}
// n = 1
for (int i = 1; i <= k; i ++) {
dp[i][1] = list.get(0);
}
for (int i = 2; i <= k; i ++) {
for (int j = 2; j <= n; j ++) {
long minTime = Long.MAX_VALUE;
for (int p = 1; p < j; p ++) {
minTime = Math.min(minTime, Math.max(dp[i - 1][p], sum(list, p, j - 1)));
}
dp[i][j] = minTime;
}
}
return dp[k][n];
}
}