华为 · dfs · 算法编程题
华为 dfs N ≤ 6 时限 1 秒 / 256 MB

题目描述

一个 N× M 的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻 8 个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少。

输入输出

输入描述
第一行有一个正整数 T ( 1≤ T≤ 20 ),表示了有 T 组数据。
对于每一组数据,第一行有两个正整数 N,M ( 1≤ N, M≤ 6 ),表示了数字矩阵为 N 行 M 列。
接下来 N 行,每行 M 个非负整数,描述了这个数字矩阵,满足 1 ≤ a_i,j≤ 10^5 。
输出描述
输出共 T 行,每行一个非负整数,输出所求得的答案。

样例共 1 组

样例 1
输入
1
3 3
1 1 1
1 1 1
1 1 1
输出
4

算法解析依据充分

考点:dfs

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

题目画像

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

解题思路

推荐方向:dfs

一条路走到底再回溯,适合枚举全部方案与连通性判定。

思路框架(dfs 通法 · 非本题专属)

  1. 定义递归函数(当前状态、已选集合、累计答案)。
  2. 写终止条件,达到终止条件时结算答案。
  3. 枚举下一步的所有选择,做选择 → 递归 → 撤销选择(回溯)。
  4. 大规模的连通块统计可用 DFS/BFS 染色标记。

实现要点:回溯时务必把状态恢复干净;必要时加剪枝(可行性剪枝、最优性剪枝)。

复杂度:时间 O(状态数) | 空间 O(递归深度)

该范式的通法易错点

  • 回溯时忘记撤销状态,答案被污染。
  • 没有剪枝导致指数级爆炸超时。

对照本题

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

样例

样例 1

  • 输入:1 / 3 3 / 1 1 1 / 1 1 1 / 1 1 1
  • 输出:4

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

本题来源:华为机试编程模拟题1。

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