class Solution {
public:
int minDifficulty(vector<int>& jobDifficulty, int d) {
int n = jobDifficulty.size();
if(n < d)
{
return -1;
}
//dp[i][j]表示前i天完成前j项任务所需的最小难度,i、j都是从0开始数。
vector<vector<int>>dp(d, vector<int>(n, INT_MAX/3));
//
dp[0][0] = jobDifficulty[0];
for(int j = 1; j < n; j++)
{//前i= 0(第0天)完成前j项任务所需的最小难度
dp[0][j] = max(dp[0][j-1], jobDifficulty[j]);
}
//
for(int i = 1; i < d; i++)
{//前i天
for(int j = i; j < n; j++)
{//前j项任务
int curMax = jobDifficulty[j];
for(int k = j; k > i-1; k--)
{//选择k将之前前i-1天的和今天完成的任务分成两段,[0, k-1]为前i-1天完成的任务,
// [k,j]为第i天完成的
curMax = max(curMax, jobDifficulty[k]);
dp[i][j] = min(dp[i][j], dp[i-1][k-1] + curMax);
}
}
}
return dp[d-1][n-1];
}
};