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

题目描述

在一幅高为 H、宽为 W 的灰度图中,每个像素都有一个实数信号值。给定一个 K×K 的策略矩阵(K 为奇数),我们先依据该矩阵为整幅图计算“能量图” E;随后,从图像的第 1 列任意行作为起点,每一列向右选择一个格子,且列与列之间的移动仅允许三种:右、右上或右下,直到走到第 W 列。请你选择一条合规路径,使路径上对应能量之和最大,并输出该最大值。
·
能量图计算规则(零填充相关):记 r = K//2
E[i][j] = Σu=0..K-1 Σv=0..K-1 P[u][v] · I[i+u−r][j+v−r]
若 i+u−r 或 j+v−r 越界,则视为该项贡献为 0。
·
路径规则:起点为第 1 列任意行;从 (i, j) 到下一列可走到 (i, j+1)、(i−1, j+1) 或 (i+1, j+1),越界无效。
·
输出:最大能量和,保留 1 位小数。

输入输出

输入描述
· 第一行:H W K
· 接下来 H 行:每行 W 个浮点数,表示图像 I
· 接下来 K 行:每行 K 个浮点数,表示策略矩阵 P
输出描述
一行一个浮点数:最大能量和(四舍五入保留 1 位小数)

样例共 1 组

样例 1 · K=1 且 P=[2],能量图即 E=2·I=[[2,4],[6,8]]。从第 1 列到第 2 列的最优路径为 (2,1)→(2,2),能量和 6+8=14.0。
输入
2 2 1
1 2
3 4
2
输出
14.0

算法解析依据充分

考点:动态规划

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:动态规划

本题切入点

先按公式算能量图(零填充的相关运算),再在能量图上做「每列向右/右上/右下」的最大路径和 DP,逐列转移取 max。

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

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

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

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

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

该范式的通法易错点

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

样例解读

样例 1:输入 2 2 1 / 1 2 / 3 4 / 2 → 输出 14.0

K=1 且 P=[2],能量图即 E=2·I=[[2,4],[6,8]]。从第 1 列到第 2 列的最优路径为 (2,1)→(2,2),能量和 6+8=14.0。

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

本题来源:2025年秋招-华为-10月22号AI岗。

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