【每日一题Day208】LC1335工作计划的最低难度 | 动态规划

这篇具有很好参考价值的文章主要介绍了【每日一题Day208】LC1335工作计划的最低难度 | 动态规划。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工作计划的最低难度【LC1335】

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

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

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

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

我和动态规划的关系就像是见过但是总是隐隐约约想不起来的陌生人
类似题目

dfs+记忆化
  • 思路

    题意可以转化为分割成d个子数组,使d个子数组的最大值之和最小。

    • 寻找子问题:如果将后 [ k , n − 1 ] [k,n-1] [k,n1]个任务在一天内完成,那么前面 [ 0 , k − 1 ] [0,k-1] [0,k1]个任务需要在 d − 1 d-1 d1天完成,因此找到了子问题,可以通过递归/动态规划来解决。(dfs+记忆化的形式最好理解)

    • 定义dfs函数:定义 d f s ( i , j ) dfs(i,j) dfs(i,j)为在 i i i天完成 [ 0 , j ] [0,j] [0,j]个任务所需要的最小难度

    • 递归入口:那么 d f s ( n − 1 , d ) dfs(n-1,d) dfs(n1,d)即为答案

    • 递归逻辑

      由于每一天都需要有工作任务,那么在决定第 i i i天的工作任务时,必须预留 i − 1 i-1 i1个工作。因此在安排第 i i i天的工作任务时,我们枚举 [ i − 1 , j ] [i-1,j] [i1,j]个任务,分割子数组,记录子数组中的最大值(当天的工作难度),然后递归到下一天,取最小值返回。
      d f s ( i , j ) = m i n k = i − 1 j { d f s ( i − 1 , k − 1 ) + m a x p = k j ( j o b D i f f i c u l t y [ p ] ) } dfs(i,j)= min_{k= i-1}^{j}\{dfs(i-1,k-1)+max_{p=k}^{j}(jobDifficulty[p])\} dfs(i,j)=mink=i1j{dfs(i1,k1)+maxp=kj(jobDifficulty[p])}

    • 递归边界

      只有一天时,必须完成所有任务

  • 实现

    (i可以整体缩小1)

    class Solution {
        int[] jobDifficulty;
        int[][] memo;
        int res = Integer.MAX_VALUE;
        public int minDifficulty(int[] jobDifficulty, int d) {
            this.jobDifficulty = jobDifficulty;
            // 分割成d个子数组,使d个子数组的最大值之和最小
            // dfs(i,j) j天完成[0,i]项工作所需要的最小难度
            int n = jobDifficulty.length;
            if (n < d){
                return -1;
            }
            memo = new int[d + 1][n];
            for (int i = 0; i <= d; i++){
                Arrays.fill(memo[i], -1);
            }
            return dfs(d, n - 1);
            
        }
        public int dfs(int i, int j){
            // if (i < 0 || j <= 0) return 0;
            if (memo[i][j] != -1) return memo[i][j];
            // 只有一天
            if (i == 1){
                int mx = 0;
                for (int k = 0; k <= j; k++){
                    mx = Math.max(mx, jobDifficulty[k]);
                }
                memo[i][j] = mx;
                return mx;
            }
            int res = Integer.MAX_VALUE;
            int mx = -1;
            // 枚举子数组范围 [i - 1, j] 留下i - 1个元素
            for (int k = j; k >= i - 1; k--){
                mx = Math.max(mx, jobDifficulty[k]);
                res = Math.min(res, mx + dfs(i - 1,k - 1));
            }
            memo[i][j] = res;
            return res;
        }
    }
    
    • 复杂度

      • 时间复杂度: O ( n 2 d ) O(n^2d) O(n2d)
      • 空间复杂度: O ( n d ) O(nd) O(nd)
递推
  • 实现

    class Solution {
        public int minDifficulty(int[] a, int d) {
            int n = a.length;
            if (n < d) return -1;
    
            var f = new int[d][n];
            f[0][0] = a[0];
            for (int i = 1; i < n; i++)
                f[0][i] = Math.max(f[0][i - 1], a[i]);
            for (int i = 1; i < d; i++) {
                for (int j = n - 1; j >= i; j--) {
                    f[i][j] = Integer.MAX_VALUE;
                    int mx = 0;
                    for (int k = j; k >= i; k--) {
                        mx = Math.max(mx, a[k]); // 从 a[k] 到 a[j] 的最大值
                        f[i][j] = Math.min(f[i][j], f[i - 1][k - 1] + mx);
                    }
                }
            }
            return f[d - 1][n - 1];
        }
    }
    
    作者:灵茶山艾府
    链接:https://leetcode.cn/problems/minimum-difficulty-of-a-job-schedule/solutions/2271631/jiao-ni-yi-bu-bu-si-kao-dong-tai-gui-hua-68nx/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度文章来源地址https://www.toymoban.com/news/detail-447505.html

      • 时间复杂度: O ( n 2 d ) O(n^2d) O(n2d)
      • 空间复杂度: O ( n d ) O(nd) O(nd)

到了这里,关于【每日一题Day208】LC1335工作计划的最低难度 | 动态规划的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表

    【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表

    环形链表 Ⅱ【LC142】 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(

    2024年02月15日
    浏览(9)
  • 【每日一题Day256】LC2600K 件物品的最大和

    袋子中装有一些物品,每个物品上都标记着数字 1 、 0 或 -1 。 给你四个非负整数 numOnes 、 numZeros 、 numNegOnes 和 k 。 袋子最初包含: numOnes 件标记为 1 的物品。 numZeroes 件标记为 0 的物品。 numNegOnes 件标记为 -1 的物品。 现计划从这些物品中恰好选出 k 件物品。返回所有可行

    2024年02月12日
    浏览(29)
  • 【每日一题Day262】LC1911最大子序列交替和 | dp

    最大子序列交替和【LC1911】 一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说,数组 [4,2,5,3] 的交替和为 (4 + 5) - (2 + 3) = 4 。 给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从 0 开始编

    2024年02月15日
    浏览(11)
  • 【每日一题Day224】LC2517礼盒的最大甜蜜度 | 二分答案

    礼盒的最大甜蜜度【LC2517】 You are given an array of positive integers price where price[i] denotes the price of the ith candy and a positive integer k . The store sells baskets of k distinct candies. The tastiness of a candy basket is the smallest absolute difference of the prices of any two candies in the basket. Return the maximum tastiness of a

    2024年02月07日
    浏览(7)
  • 【每日一题Day267】LC834树中距离之和 | 换根dp

    树中距离之和【LC834】 给定一个无向、连通的树。树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edges[i] = [ai, bi] 表示树中的节点 ai 和 bi 之间有一条边。 返回长度为 n 的数组 answer ,其中 answer[i] 是树中第 i 个节点与所有其他节点之间的距离之和。

    2024年02月16日
    浏览(10)
  • 【每日一题Day191】LC2423删除字符使频率相同 | 枚举 分类讨论

    给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。 如果删除一个字母后, word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。 注意: 字母 x 的 频

    2024年02月01日
    浏览(18)
  • 【每日一题Day292】LC1572矩阵对角线元素的和 模拟

    思路 简单模拟,主对角线的元素横纵坐标相等,副对角线的元素横纵坐标相加为n-1,注意避免重复计算 实现 复杂度 时间复杂度: O ( log ⁡ n ) mathcal{O}(log n) O ( lo g n ) 空间复杂度: O ( 1 ) mathcal{O}(1) O ( 1 )

    2024年02月13日
    浏览(12)
  • Linux的例行性工作(计划任务)

    Linux的例行性工作(计划任务)

    目录 一、单一执行的例行性任务--at(一 次性) 1、安装 2、启动服务 3、at命令详解 1)格式 2)参数 3)时间格式 4、实例 二、循环执行的例行性任务-- crontab(周期性) 1、crontd服务 2、工作过程 3、crontab命令详解 编辑crontab 书写定时任务的注意事项 系统级别的计划任务 查看

    2024年01月25日
    浏览(15)
  • 【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心

    打家劫舍 IV【LC2560】 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大金额

    2024年02月07日
    浏览(9)
  • 【每日一题Day311】LC1761一个图中连通三元组的最小度数 | 枚举

    给你一个无向图,整数 n 表示图中节点的数目, edges 数组表示图中的边,其中 edges[i] = [ui, vi] ,表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 三个 节点组成的集合且这三个点之间 两两 有边。 连通三元组的度数 是所有满足此条件的边的数目:一个顶点在这个三

    2024年02月10日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包