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

题目描述

公元 2242 年,您是星际勘探舰“奥德赛号”的舰长,正在执行一项穿越未知小行星带的危险任务。
远程扫描显示,前方有一条由 m 颗小行星组成的直线路径,每一颗都蕴藏着宝贵的能量水晶。
您的任务是规划航线,最大限度地补充舰船的能量储备。
您将要穿越的星系包含 m 颗小行星,编号从 1 到 m 。您的舰船只能沿着编号递增的方向前进,无法后退。
初始状态 : 您的舰船携带有 n 个单位的初始能量。
航行消耗 : 从当前位置航行到下一颗小行星,需要消耗 1 个单位的能量。如果能量为 0 ,舰船将无法启动,无法航行到新的小行星。
能量采集 : 您装备了一台高能水晶采集器,但由于能源核心的限制,在整个任务中最多只能使用 k 次。每颗小行星最多只能被采集一次。采集小行星 i 上的水晶,可以为舰船瞬间补充 a_i 个单位的能量。
您的目标是,在整个勘探任务的任意时刻,舰船所能达到的**最大能量值**是多少?
请注意,您可以选择不登陆任何小行星。

输入输出

输入描述
第一行包含三个正整数 m, n, k ( 1 ≤ m, n, k ≤ 20 ),由空格隔开。
第二行包含 m 个整数 a_1, a_2, ..., a_m ( 0 ≤ a_i ≤ 20 ),代表每颗小行星上蕴含的能量水晶数量,由空格隔开。
输出描述
一个整数,表示在整个任务过程中,舰船能达到的最大能量值。

样例共 1 组

样例 1
输入
17 20 19
19 0 2 6 20 3 4 1 8 3 8 7 14 8 19 11 17
输出
153

算法解析依据充分

考点:动态规划

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

题目画像

  • 数据规模:m ≤ 20,n ≤ 20,k ≤ 20
  • 元素值域:a_i ≤ 20(注意整数类型选择,避免溢出)
  • 复杂度门槛:允许指数级做法:暴力枚举全部子集 2^n / 回溯搜索 / 状压 DP。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:动态规划

本题切入点

dp[i][j] = 到达第 i 颗小行星、已用 j 次采集时的最大能量,逐颗转移(采集/不采集);m,n,k≤20 规模极小,也可用记忆化搜索。

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

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

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

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

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

该范式的通法易错点

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

对照本题

  • 数据规模 n ≤ 20,允许指数级做法:暴力枚举全部子集 2^n / 回溯搜索 / 状压 DP。
  • 元素值域最大到 20 —— 求和 / 相乘时记得开 64 位整数。

题目给出的提示

  • 您可以选择不登陆任何小行星

样例

样例 1

  • 输入:17 20 19 / 19 0 2 6 20 3 4 1 8 3 8 7 14 8 19 11 17
  • 输出:153

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

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

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