1335. Minimum Difficulty of a Job Schedule

2023-11-18 08:29:50 浏览数 (2)

1335. Minimum Difficulty of a Job Schedule

You want to schedule a list of jobs in d days. Jobs are dependent (i.e To work on the i-th job, you have to finish all the jobs j where 0 <= j < i).

You have to finish at least one task every day. The difficulty of a job schedule is the sum of difficulties of each day of the d days. The difficulty of a day is the maximum difficulty of a job done in that day.

Given an array of integers jobDifficulty and an integer d. The difficulty of the i-th job is jobDifficulty[i].

Return the minimum difficulty of a job schedule. If you cannot find a schedule for the jobs return -1.

Example 1:

代码语言:javascript复制
Input: jobDifficulty = [6,5,4,3,2,1], d = 2
Output: 7
Explanation: First day you can finish the first 5 jobs, total difficulty = 6.
Second day you can finish the last job, total difficulty = 1.
The difficulty of the schedule = 6   1 = 7 

Example 2:

代码语言:javascript复制
Input: jobDifficulty = [9,9,9], d = 4
Output: -1
Explanation: If you finish a job per day you will still have a free day. you cannot find a schedule for the given jobs.

Example 3:

代码语言:javascript复制
Input: jobDifficulty = [1,1,1], d = 3
Output: 3
Explanation: The schedule is one job per day. total difficulty will be 3.

Example 4:

代码语言:javascript复制
Input: jobDifficulty = [7,1,7,1,7,1], d = 3
Output: 15

Example 5:

代码语言:javascript复制
Input: jobDifficulty = [11,111,22,222,33,333,44,444], d = 6
Output: 843

Constraints:

  • 1 <= jobDifficulty.length <= 300
  • 0 <= jobDifficulty[i] <= 1000
  • 1 <= d <= 10

思路:

题目意思是给定一个数组,每个元素代表一个任务的完成时间,再给出一个天数,让分配这些任务,每天完成的任务数不限制,耗时按照最大的计算,保证所有天数加起来耗时最小。 可以从划分的角度考虑,对于j个任务,第k天完成的任务的最小值,等于前j-k天完成的最小值,加上后面任务完成所需的最大值。那状态转移方程就可以是: dp[i][k] = min(dp[j][k-1] max(jobs[j 1, i])) (k - 1 <= j < i)。j个任务的取值范围有下界是因为任务数量一定要大于天数,不然题目是无解的。

代码:

golang:

代码语言:javascript复制
func minDifficulty(jobs []int, d int) int {
    m := len(jobs)
    if m < d {
        return -1
    }
    
    var dp = make([][]int, m   1)
    for i := range dp {
        dp[i] = make([]int, d   1)
        for j := range dp[i] {
            dp[i][j] = math.MaxInt16
        }
    }
    
    dp[0][0] = 0
    for i := 1; i <= m; i   {
        for k := 1; k <= d; k   {
            maxDay := 0
            for j := i - 1; j >= k - 1; j-- {
                maxDay = max(maxDay, jobs[j])
                dp[i][k] = min(dp[i][k], dp[j][k-1]   maxDay)
            } 
        }
    }
    
    return dp[m][d]
    
}

func max(i, j int) int {
    if i > j {
        return i
    }
    return j
}

func min(i, j int) int {
    if i < j {
        return i
    }
    return j
}

0 人点赞