当前位置: 首页 > news >正文

1411.给 N x 3 网格图涂色的方案数

LeetCode 1411:给 N x 3 网格图涂色的方案数

1. 题目介绍

LeetCode 1411 题“给 N x 3 网格图涂色的方案数”(Number of Ways to Paint N × 3 Grid) 是一道典型的动态规划 (Dynamic Programming) 问题。

题目要求

用 3 种颜色涂满 n×3 网格,要求任何相邻(上下或左右)的格子颜色都不能相同,找出所有合法方案数。

2. 解题思路

2.1 问题简化:单行分析

解决这个问题的关键在于找出“行与行”之间的递推关系。首先,我们将问题简化,只分析单行 (1×3) 的情况。

在遵守“左右相邻格子颜色不同”的规则下,一行 3 个格子的颜色组合模式主要可以分为两类

  1. ABC 类:三个格子颜色全不同(用了 3 种颜色),例如:红-绿-蓝
  2. ABA 类:两边的格子颜色相同(只用了 2 种颜色),例如:红-绿-红

2.2 单行方案数计算

ABC 类(三色)

  • 第 1 个格子:有 3 种选择
  • 第 2 个格子:有 2 种选择(不能和第 1 个同色)
  • 第 3 个格子:只有 1 种选择(不能和前两个同色)
  • 总方案数:3×2×1=6 种

ABA 类(双色)

  • 第 1 个格子:有 3 种选择
  • 第 2 个格子:有 2 种选择(不能和第 1 个同色)
  • 第 3 个格子:只有 1 种选择(必须和第 1 个同色)
  • 总方案数:3×2×1=6 种

因此,单行总共有 6+6=12 种合法方案。

3. 动态规划状态定义

我们定义两个状态变量:

  • A**n:第 n 行是 ABC 类 的方案数
  • B**n:第 n 行是 ABA 类 的方案数

4. 状态转移方程推导

4.1 状态转移规律分析

通过具体例子分析,我们可以得到以下状态转移规律:

上一行状态 下一行变成 ABC (三色) 下一行变成 ABA (双色)
ABC 类 (A**i) 生成 2 生成 2
ABA 类 (B**i) 生成 2 生成 3

4.2 状态转移方程

根据上述规律,我们可以推导出状态转移方程:

  1. 下一行是 ABC 类
    A**i+1 = 2×A**i + 2×B**i

  2. 下一行是 ABA 类
    B**i+1 = 2×A**i + 3×B**i

5. 初始状态

n=1 时:

  • A1 = 6(ABC 类方案数)
  • B1 = 6(ABA 类方案数)

6. 最终结果

n 行的总方案数为第 n 行所有合法情况的总和:

Total**n = A**n + B**n

7. 代码实现

7.1 注意事项

  1. 大数处理:由于 n 最大可以达到 5000,方案数会以指数级增长,需要对结果取余(通常取 1e9+7)
  2. 旧值保存:在更新状态时,需要保存旧值,避免覆盖后影响后续计算

7.2 C++ 代码实现

class Solution {
public:int numOfWays(int n) {long long a = 6, b = 6; // n=1 时的初始值 (ABC:6, ABA:6)int mod = 1e9 + 7;for (int i = 2; i <= n; i++) {// 用临时变量 t 保存旧的 a 值,防止被覆盖long long t = a;// 更新 a (ABC 类): 公式 2*A + 2*Ba = (2 * t + 2 * b) % mod;// 更新 b (ABA 类): 公式 2*A + 3*B// 注意这里使用的是旧值 tb = (2 * t + 3 * b) % mod;}// 最后记得再次取余return (a + b) % mod;}
};

8. 算法复杂度分析

  • 时间复杂度:O(n),只需要遍历一次到 n
  • 空间复杂度:O(1),只使用了几个变量

9. 总结

LeetCode 1411 题是一道典型的动态规划问题,通过以下步骤解决:

  1. 将问题简化为单行分析,识别出两种核心状态
  2. 计算单行的方案数,确定初始状态
  3. 推导状态转移方程,建立行与行之间的联系
  4. 实现代码,注意大数处理和旧值保存
  5. 计算最终结果,返回总方案数

这个解法体现了动态规划的核心思想:将复杂问题分解为简单子问题,通过状态定义和状态转移方程逐步求解。

http://www.jsqmd.com/news/186447/

相关文章:

  • 自动标注+手动修正双模式:lora-scripts高效构建metadata.csv文件
  • 一点资讯个性化推送:根据用户画像发送lora-scripts资讯
  • 国产算力卡如寒武纪、昇腾能否运行lora-scripts?
  • 飞算JavaAI配置生成避坑指南,99%新手都会忽略的关键细节
  • 快速上手ARM Cortex-M ISR配置:新手入门步骤
  • 为什么你的 Spring Native 应用启动要3秒?这5个关键优化点你必须掌握
  • 国内用户福音:huggingface镜像网站助力lora-scripts模型拉取
  • STM32中CANFD和CAN的区别:一文说清通信机制差异
  • 2026年GEO服务商全景解析(2026年1月更新) - 品牌2025
  • Spring Native 为何无法超越传统JVM启动速度?深度剖析编译期优化盲区
  • Yandex俄罗斯市场推广:拓展lora-scripts使用范围
  • 蓝牛文件编码格式批量转换助手V2.10 免费版
  • 告别复杂代码:lora-scripts封装全流程,让LoRA微调真正开箱即用
  • 模拟I2C从机响应逻辑构建入门必看
  • 揭秘JavaDoc集成Markdown预览:如何3步实现专业级API文档生成
  • 你真的会用Quarkus 2.0做物联网开发吗?90%工程师忽略的3个关键陷阱
  • Product Hunt新品发布:让海外用户认识lora-scripts
  • 滥用Google Cloud官方域名的高级网络钓鱼攻击分析与防御
  • Java外部内存性能大比拼(DirectBuffer vs Unsafe vs Foreign Memory API):数据告诉你该用哪个
  • 【Java外部内存性能对比】:5大主流方案实测结果揭晓,谁才是真正的性能之王?
  • lora-scripts支持哪些主流模型?全面兼容Stable Diffusion和LLaMA 2
  • 群星闪耀:著名科学家核心研究方法深度剖析与传承
  • 2025年四川高中复读学校推荐排行,高中复读学校/实验学校/实验中学/高中/学校/中学/名办高中高中复读学校生产厂家推荐排行 - 品牌推荐师
  • 为什么你的ZGC还是有停顿?深入剖析内存管理盲区(附诊断工具)
  • 一文说清STLink驱动安装全过程(适合初学者)
  • 避免股票买在危险价格
  • 利用硬件USART模块实现奇偶校验:项目应用示例
  • 【稀缺资源】Quarkus 2.0物联网适配内部技术白皮书流出:仅限本周公开解读
  • 实现Proteus与Keil联调51单片机的详细配置步骤
  • 你还在用手动循环?JDK 23向量API让并行计算自动化