leetcode 1335. 工作计划的最低难度
程序员文章站
2022-04-02 18:49:38
...
你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 <= j < i)。
你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一天的难度之和,而一天的工作难度是当天应该完成工作的最大难度。
给你一个整数数组 jobDifficulty 和一个整数 d,分别代表工作难度和需要计划的天数。第 i 项工作的难度是 jobDifficulty[i]。
返回整个工作计划的 最小难度 。如果无法制定工作计划,则返回 -1 。
示例 1:
输入:jobDifficulty = [6,5,4,3,2,1], d = 2
输出:7
解释:第一天,您可以完成前 5 项工作,总难度 = 6.
第二天,您可以完成最后一项工作,总难度 = 1.
计划表的难度 = 6 + 1 = 7
简单dp,dp[i][j]代表前i天完成前j个任务的最小花销,那么dp[i][j]应该等于dp[i-1][k]加上从k+1天到第j天中job值中的最大的,那么对于每一个i和j,枚举中间变量k即可。
另外找最大值时不需要再写找区间最大值的函数,从k+1到j每加进来一个数就更新一下当前最大值即可。
class Solution {
public int minDifficulty(int[] jobDifficulty, int d) {
int len = jobDifficulty.length;
if(len<d)
return -1;
int dp[][] = new int [d+1][len+1];
for(int i=1;i<=d;i++)//初始化dp数组使之为最大值
{
for(int j=1;j<=len;j++)
dp[i][j] = 0x3f3f3f3f;
}
for(int i=1;i<=1;i++)//枚举第一天完成的任务数
{
int now = 0;//now代表当前最大值
for(int j=1;j<=len;j++)
{
now = Math.max(now,jobDifficulty[j-1]);
dp[i][j] = now;
}
}
for(int i=2;i<=d;i++)
{
for(int j=1;j<len;j++)
{
int now = jobDifficulty[j];
for(int k=j+1;k<=len;k++)//枚举中间变量k
{
now = Math.max(now,jobDifficulty[k-1]);
dp[i][k] = Math.min(dp[i][k],dp[i-1][j] + now);
}
}
}
return dp[d][len];
}
}
上一篇: Schedule
推荐阅读
-
leetcode 235. Lowest Common Ancestor of a Binary Search Tree(二叉树的最低共同祖先)
-
【Python】【难度:简单】Leetcode 1351. 统计有序矩阵中的负数
-
考研难度最低的十大211学校:海南大学上榜,辽宁大学第三
-
LeetCode刷题之数据库-180. 连续出现的数字(难度-中等)
-
LeetCode-Python-1167. 连接棒材的最低费用
-
leetcode 7 easy的难度但是还是再次的提醒了我 math的重要性
-
【10月打卡~Leetcode每日一题】530. 二叉搜索树的最小绝对差(难度:简单)
-
(每日一题。)LeetCode:452. 用最少数量的箭引爆气球。——————中等难度!!!
-
【11月打卡~Leetcode每日一题】452. 用最少数量的箭引爆气球(难度:中等)
-
LeetCode 1335. 工作计划的最低难度(DP)