华为 · 动态规划 · 算法编程题
华为 动态规划 n ≤ 2000 时限 1 秒 / 256 MB

题目描述

时值中世纪,您是一位雄心勃勃的商人,计划在地中海的各大城市之间开展一系列贸易活动。您获得了一份航海图,上面标注了 n 条利润丰厚的贸易航线。每一条航线都连接着两个港口,有明确的出发和到达日期,并需要一支特定规模的商队来完成。您的目标是在有限的资源下,规划出最赚钱的贸易路线。
您有 n 个贸易机会可供选择。对于第 i 个贸易机会,您掌握以下信息:
出发时间 : startTime_i
到达时间 : endTime_i
所需商队规模 : effort_i
预期利润 : profit_i
您所能召集的最大商队规模为 maxEffort 。在任何时候,您都只能派遣一支商队,因此您不能同时进行时间上重叠的贸易活动。然而,如果一趟贸易在时间 X 结束,您可以立即开始一趟新的、在时间 X 出发的贸易。
您的任务是制定一份贸易计划,选择一部分贸易机会来执行,使得总利润最大化,同时确保任何时刻派遣的商队规模之和都不超过您的最大能力 maxEffort 。

输入输出

输入描述
输入包含 5 个参数,前四个是描述贸易机会的数组,第五个是您的最大商队规模。
1. 出发时间数组 ( startTime ) : 一个整数数组,表示每个贸易机会的出发时间。
2. 到达时间数组 ( endTime ) : 一个整数数组,表示每个贸易机会的到达时间。
3. 商队规模数组 ( effort ) : 一个整数数组,表示完成每个贸易机会所需的商队规模。
4. 利润数组 ( profit ) : 一个整数数组,表示完成每个贸易机会可获得的利润。
5. 最大商队规模 ( maxEffort ) : 一个整数,表示您能召集的最大商队规模。
约束条件 :
所有数组的长度 n 相等,且 1 ≤ n ≤ 2000 。
1 ≤ startTime_i < endTime_i ≤ 2000 。
1 ≤ effort_i, profit_i ≤ 10^9 。
1 ≤ maxEffort ≤ 1000 。
输入格式 :
输入共 5 行,每行代表一个参数。前 4 行的数组数据由空格分隔。
输出描述
一个整数,代表您能获得的最大总利润。

样例共 1 组

样例 1
输入
2 4 7
6 8 11
20 20 20
30 90 30
40
输出
90

算法解析依据充分

考点:动态规划

数据规模 n ≤ 2000 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 2000
  • 元素值域:effort_i ≤ 1e9,profit_i ≤ 1e9,startTime_i ≤ 2000(注意整数类型选择,避免溢出)
  • 复杂度门槛:只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:动态规划

本题切入点

时间不重叠 + 总商队规模不超上限的最大利润:按结束时间排序后做 DP(状态含已用规模),即「区间调度 + 资源维度」的联合状态递推。

把问题拆成子问题,用状态表示「已处理到哪儿」,靠转移方程递推。

思路框架(动态规划 通法 · 非本题专属)

  1. 定义状态:dp[i] / dp[i][j] 表示什么(这是最关键的一步,状态定义错就全错)。
  2. 写转移方程:当前状态由哪些更小的状态推来。
  3. 确定初始条件与遍历顺序(保证用到的状态已算好)。
  4. 确定答案取哪个状态;数值大时全程取模。

实现要点:一般是「先枚举阶段,再枚举状态,最后枚举决策」三层循环;空间大时可滚动数组优化。

复杂度:时间 O(状态数 × 转移代价) | 空间 O(状态数)

该范式的通法易错点

  • 状态定义不完整(漏了必要维度),导致子问题之间有后效性。
  • 初始化写错(尤其「恰好」与「至多」的初值差别)。
  • 遍历顺序与依赖方向不一致。

对照本题

  • 数据规模 n ≤ 2000,只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 元素值域最大到 1e9 —— 求和 / 相乘时记得开 64 位整数。

样例

样例 1

  • 输入:2 4 7 / 6 8 11 / 20 20 20 / 30 90 30 / 40
  • 输出:90

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-10月23号留学生开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解