工作计划的最低难度
你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 <= j < i)。
你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一天的难度之和,而一天的工作难度是当天应该完成工作的最大难度。
给你一个整数数组 jobDifficulty 和一个整数 d,分别代表工作难度和需要计划的天数。第 i 项工作的难度是 jobDifficulty[i]。
返回整个工作计划的 最小难度 。如果无法制定工作计划,则返回 -1 。
1. 二维动态规划(记忆化搜索)
class Solution {
public:
vector<vector<int>> dp;//dp[i][j]表示从第i项工作开始,工作j天的最小难度
int minDifficulty(vector<int>& jobDifficulty, int d) {
int n = jobDifficulty.size();
if(n<d) return -1;
dp.resize(n,vector<int>(d+1,INT_MAX));
for(int i=n-1,curmax=0;i>=0;i--){//初始化边界条件,只剩一天的情况
curmax = max(curmax,jobDifficulty[i]);
dp[i][1] = curmax;
}
for(int day = 1,sum = 0;day<=d;day++){//初始化边界条件,剩余天数跟任务数相同
sum+=jobDifficulty[n-day];
dp[n-day][day] = sum;
}
return mindif(jobDifficulty,d,0);
}
int mindif(vector<int>& job,int d,int start){
if(dp[start][d]!=INT_MAX) return dp[start][d];
int curmax = 0;
for(int i=start;i<job.size();i++){//把第i天作为结束天
if(i+d>job.size()) break;
curmax = max(curmax,job[i]);
dp[start][d] = min(dp[start][d],curmax+mindif(job,d-1,i+1));
}
return dp[start][d];
}
};