欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 1335. 工作计划的最低难度

程序员文章站 2022-04-02 18:49:38
...

你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 <= j < i)。

你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一天的难度之和,而一天的工作难度是当天应该完成工作的最大难度。

给你一个整数数组 jobDifficulty 和一个整数 d,分别代表工作难度和需要计划的天数。第 i 项工作的难度是 jobDifficulty[i]。

返回整个工作计划的 最小难度 。如果无法制定工作计划,则返回 -1 。

示例 1:
leetcode 1335. 工作计划的最低难度
输入: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];
    }
}