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

本文介绍了一种解决工作计划最小难度问题的算法。通过动态规划方法,计算在给定工作难度和计划天数下,如何安排工作以达到最小总难度。文章详细解析了算法思路,包括初始化dp数组、枚举任务数和中间变量k的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你需要制定一份 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];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值