class Solution {
public int minDifficulty(int[] diff, int d) {
if (diff.length < d) return -1;
int n = diff.length;
// dp[i][j] is min total diff until the ith day if arrange jobs from 0 - j
int[][] dp = new int[d][n];
dp[0][0] = diff[0];
for (int i = 1; i < n; i++) {
dp[0][i] = Math.max(dp[0][i - 1], diff[i]);
}
int[][] maxdiff = new int[n][n];
for (int i = 0; i < n; i++) {
maxdiff[i][i] = diff[i];
}
for (int i = 0; i < n; i++) {
for (int len = 1; i + len < n; len++) {
int j = i + len;
maxdiff[i][j] = Math.max(maxdiff[i][j - 1], diff[j]);
}
}
for (int i = 1; i < d; i++) {
for (int j = i; j < n; j++) {
int profit = Integer.MAX_VALUE;
for (int k = i - 1; k < j; k++) {
profit = Math.min(profit, dp[i - 1][k] + maxdiff[k + 1][j]);
}
dp[i][j] = profit;
}
}
return dp[d - 1][n - 1];
}
}