Skip to content

服务器托管,北京服务器托管,服务器租用-价格及机房咨询

Menu
  • 首页
  • 关于我们
  • 新闻资讯
  • 数据中心
  • 服务器托管
  • 服务器租用
  • 机房租用
  • 支持中心
  • 解决方案
  • 联系我们
Menu

【每日一题】工作计划的最低难度

Posted on 2023年5月18日 by hackdl

1335. 工作计划的最低难度

关键词:动态规划、线性DP、单调栈

题目来源:1335. 工作计划的最低难度 – 力扣(Leetcode)

题目描述

 T动态规划
 T线性DP
 T单调栈

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

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

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

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

输入:jobDifficulty = [6,5,4,3,2,1], d = 2
输出:7 
输入:jobDifficulty = [9,9,9], d = 4
输出:-1
数据范围
1 

动态规划

设f(i, j) = 前i天完成前j项工作的最小难度,则f(i, j) = min( f(i-1, k) + max(k+1..j) ),其中,k≥i(每天必须完成1项任务),max(k+1..j)表示任务k+1~j的最大难度。

int minDifficulty(vector &jobDifficulty, int d) {

    auto &job = jobDifficulty;
    int n = job.size();
    if (n = i; k--) {
                ma = max(job[k], ma);
                dp[i][j] = min(dp[i - 1][k - 1] + ma, dp[i][j]);
            }
        }
    }
    return dp[d - 1][n - 1];
}

时间复杂度:O(dn2)

空间复杂度:O(dn)

观察代码发现,在计算(i,j)时,只用到第i-1行第j列左侧的数据,故,可dp数组改为一维。由于在计算j时用到的k-1小于j,所以,为避免计算(i, j)时覆盖掉计算(i, j+1)所需要的第i-1行的数据,j应改为从大到小。

int minDifficulty(vector &jobDifficulty, int d) {
    auto &job = jobDifficulty;
    int n = job.size(), INF = 1e9;
    if (n = i; j--) {
            dp[j] = INF, ma = 0;
            for (int k = j; k >= i; k--) {
                ma = max(job[k], ma);
                dp[j] = min(dp[k - 1] + ma, dp[j]);
            }
        }
    }
    return dp[n - 1];
}

时间复杂度:O(dn2)

空间复杂度:O(n)

单调栈

本解法实际上是使用单调栈对动态规划解法进行优化,而不是单纯的单调栈。

对于前j份工作,若已知满足job[p]>job[j]且p<j的最大p,则f(i, j)的求解可分为如下两部分:

  • 当k≥p时,max(k+1, j) = job[j],故f(i, j) = min( f(i-1, k) ) + job[j],其中k∈[p, j-1]
  • 当k<p时,f(i, j) = min( f(i-1, k) + max(k+1..p) ) = f(i, p),其中k∈[i, p-1]

维护p可使用单调栈,但同时还需要维护min( f(i-1, k) ) ,故采用二元组(p, v),表示满足job[p]>job[j]且p<j的最大p,且min( f(i-1, k) ) = v。

int minDifficulty_4(vector &jobDifficulty, int d) {
    auto &job = jobDifficulty;
    int n = job.size();
    if (n 

时间复杂度:O(dn)。对于每个j,求对应p的过程可看做是O(1)的,因为每轮(对于i而言),入栈/出栈操作最多只有n次。

空间复杂度:O(dn)

在计算第i行时只用到第i-1行的数据,故也可采用滚动数组对空间进行优化,但是,不能像解法一动态规划中那样改变j的遍历顺序,因为本解法中,在计算(i, j)时,用到了(i, k),其中k小于j,所以需要在j之前计算出k,故采用两个数组交替使用的方式。

int minDifficulty_5(vector &jobDifficulty, int d) {

    auto &job = jobDifficulty;
    int n = job.size();
    if (n 

时间复杂度:O(dn)

空间复杂度:O(n)

服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net

Related posts:

  1. 如何选择服务器托管服务商
  2. 双线服务器托管租用选购指南
  3. 中国电信北京分公司idc业务
  4. 江西服务器托管服务平台:安全稳定可靠
  5. IDC托管服务合同:细节解析

服务器托管,北京服务器托管,服务器租用,机房机柜带宽租用

服务器托管

咨询:董先生

电话13051898268 QQ/微信93663045!

上一篇: angular-devkit 中 build-angular 包的作用
下一篇: 基于分水岭算法的图像分割-Matlab版本

最新更新

  • 五月学习之keepalived 软件简介
  • Cibersort免疫浸润的在线分析及R语言代码实现
  • 阿里云的认证最有几个等级?考试费用是多少?
  • 京东APP百亿级商品与车关系数据检索实践 | 京东云技术团队
  • 【Hello Network】TCP协议 TCP协议 确认应答机制 (ACK) 超时重传机制 连接管理机制 流量控制 滑动窗口 拥塞控制 延时应答 捎带应答 面向字节流 粘包问题 TCP的异常情况 TCP小结 基于TCP的应用层协议

随机推荐

  • (第22章)LinuxC本质中Makefile基础
  • 服务器ping不通域名的检查处理办法
  • 重庆双线服务器托管费用实惠
  • 北京idc能耗指标中标情况
  • 探讨idc服务器租用的相关问题

客服咨询

  • 董先生
  • 微信/QQ:93663045
  • 电话:13051898268
  • 邮箱:dongli@hhisp.com
  • 地址:北京市石景山区重聚园甲18号2层

友情链接

  • 服务器托管
  • 服务器租用
  • 机房租用托管
  • 服务器租用托管
©2023 服务器托管,北京服务器托管,服务器租用-价格及机房咨询 京ICP备13047091号-8