跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言算法

N x 3 网格图涂色方案数动态规划解法

给定 n x 3 网格图,使用三种颜色涂色且相邻格子颜色不同,求方案数。提供两种解法:一是基于 DFS 的状态压缩记忆化搜索,二是通过观察行模式推导出的二阶线性递推公式 f(n) = 5*f(n-1) - 2*f(n-2)。后者效率更高,适用于 n 较大的情况。

ServerBase发布于 2026/3/16更新于 2026/9/885 浏览
N x 3 网格图涂色方案数动态规划解法

题目

你有一个 n x 3 的网格图 grid,你需要用红,黄,绿三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同)。

给你网格图的行数 n。

请你返回给 grid 涂色的方案数。由于答案可能会非常大,请你返回答案对 10^9 + 7 取余的结果。

示例 1:

  • 输入:n = 1
  • 输出:12

解释:总共有 12 种可行的方法:

示例 2:

  • 输入:n = 2
  • 输出:54

示例 3:

  • 输入:n = 3
  • 输出:246

示例 4:

  • 输入:n = 7
  • 输出:106494

示例 5:

  • 输入:n = 5000
  • 输出:30228214

提示:

  • n == grid.length
  • grid[i].length == 3
  • 1 <= n <= 5000

题目分析

第一种方法,先考虑暴力搜索,枚举每个格子涂哪种颜色。

第二种方法,可以找到规律:

这个涂色问题的答案满足一个递推公式:

f(n) = 5 × f(n-1) - 2 × f(n-2)

其中:

  • f(1) = 12
  • f(2) = 54
  • f(3) = 5×54 - 2×12 = 270 - 24 = 246
  • f(4) = 5×246 - 2×54 = 1122
  • ……

为了能让这个公式从 n=2 开始算,我们人为定义一个 f(0) = 3(它没有实际意义,只是为了公式成立)。

验证一下:

  • f(2) = 5×f(1) - 2×f(0) = 5×12 - 2×3 = 60 - 6 = 54 ✅

方法一:状态压缩记忆化搜索

采用 DFS+ 记忆化的方法,从下往上逐格涂色:

  1. 状态表示:
    • (i, j) 表示当前正在涂第 i 行第 j 列
    • preRow 表示下一行(i+1 行)的颜色状态(用 6 位二进制表示)
    • curRow 表示当前行已涂色的状态
  2. 状态转移:
    • 每个格子尝试三种颜色
    • 需要检查:不能与下方格子颜色相同,不能与左侧格子颜色相同
    • 使用位运算高效地存储和检查颜色状态
  3. 记忆化优化:
    • 将 (i, j, preRow, curRow) 压缩为一个整数作为 key
    • 避免重复计算相同状态

方法二:数学递推公式

关键观察:每行只有两种模式

由于每行只有 3 个格子,且左右不能同色,我们可以枚举所有合法的单行涂色方式。

用三种颜色 A、B、C 表示,合法的行模式只有两类:

类型 1:ABA 型(首尾相同)

例如:红 - 黄 - 红、蓝 - 红 - 蓝 → 满足:color[0] == color[2] != color[1]

类型 2:ABC 型(三色全不同)

例如:红 - 黄 - 蓝、蓝 - 绿 - 红 → 满足:color[0] != color[1] != color[2] 且 color[0] != color[2]

💡 总共合法单行方案数:ABA 型:3 × 2 = 6 种(选首尾颜色 3 种,中间不同 2 种)ABC 型:3 × 2 × 1 = 6 种共 12 种 → 所以 f(1) = 12

动态规划状态设计

设:

  • a[i] = 第 i 行是 ABA 型 的方案总数
  • b[i] = 第 i 行是 ABC 型 的方案总数

则总方案数:f[i] = a[i] + b[i]

推导转移关系(关键!)

考虑第 i-1 行和第 i 行的颜色不能上下相同:

上一行类型下一行可接的 ABA 数量下一行可接的 ABC 数量
ABA32
ABC22

这个可以通过枚举验证(略,但标准结论如此)

于是得到递推式:

所以总方案数:

但我们希望只用 f[i] 表示。注意到:

  • f[i-1] = a[i-1] + b[i-1]
  • f[i-2] = a[i-2] + b[i-2]

通过代数消元(或矩阵快速幂特征方程),可以推出一个二阶线性递推式:

f[i] = 5 * f[i-1] - 2 * f[i-2]

目录

  1. 题目
  2. 题目分析
  3. 方法一:状态压缩记忆化搜索
  4. 方法二:数学递推公式
  5. 关键观察:每行只有两种模式
  6. 类型 1:ABA 型(首尾相同)
  7. 类型 2:ABC 型(三色全不同)
  8. 动态规划状态设计
  9. 推导转移关系(关键!)

更多推荐文章

查看全部
  • 转行 AI 产品经理的核心能力与路径指南
  • AI 写作小说全流程指南及工具推荐
  • QUEST 一体机 SideQuest 安装 APK 与 OBB 数据包教程
  • 智能家居安全摄像头对比:Ring与Blink全面解析
  • 基于腾讯云 HAI 与 DeepSeek 快速搭建个人网页
  • Vue 3 核心开发指南:组合式 API 与状态管理实战
  • CVE-2026-21962 Oracle WebLogic 代理插件 RCE 漏洞深度解析与防护
  • ActiveMQ 延迟投递与定时调度实战指南
  • GitHub 技术文档数学公式专业渲染方案
  • Python AI 入门实战:从线性回归到图像分类
  • C++ 模板初阶
  • Spring @Transactional 事务未回滚?检查 MySQL 存储引擎配置
  • 基于 Coze 平台从零搭建企业级 AI 客服机器人实战指南
  • Stable Diffusion WebUI 本地部署完整教程
  • 魔因漫创集成中转平台实现低成本AI漫画视频创作
  • OpenClaw + cpolar:实现本地 AI 智能体的远程访问与内网穿透
  • JDK 21 G1 与 ZGC 垃圾收集器对比分析
  • KWDB 运维实战:用 SQL 打通 Metrics 与 CMDB
  • 3DMAX VR 渲染器局部渲染设置
  • AI 转型攻略:产品经理如何顺利过渡至 AI 领域

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online