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

1931. 用三种不同颜色为网格涂色

题目链接

1931. 用三种不同颜色为网格涂色 - 力扣(LeetCode)

题目描述

给你两个整数mn。构造一个m x n的网格,其中每个单元格最开始是白色。请你用 红、绿、蓝 三种颜色为每个单元格涂色。所有单元格都需要被涂色。

涂色方案需要满足:不存在相邻两个单元格颜色相同的情况 。返回网格涂色的方法数。因为答案可能非常大, 返回 对109 + 7取余 的结果。

题目示例

示例 1 :

输入:m = 1, n = 1 输出:3 解释:如上图所示,存在三种可能的涂色方案。

示例 2 :

输入:m = 1, n = 2 输出:6 解释:如上图所示,存在六种可能的涂色方案。

解题思路

  1. 问题理解
    • 给定一个m x n的网格,用3种颜色涂色,要求相邻网格颜色不同。
    • 计算所有合法的涂色方案数,结果对10^9+7取模。
  2. 关键思路
    • 状态压缩:将每列的颜色状态用三进制数表示(0/1/2对应三种颜色)。
    • 有效状态筛选:生成所有列内相邻颜色不同的有效状态。
    • 状态转移图:构建状态之间的转移关系(相邻列对应位置颜色不同)。
    • 记忆化搜索:动态规划计算方案数,避免重复计算。
  3. 算法流程
    • 预处理3的幂次数组pow3,用于状态处理。
    • 生成所有有效的列颜色状态valid
    • 构建状态转移图nxt,表示每个状态可以转移到哪些其他状态。
    • 使用记忆化搜索dfs计算方案数,从最后一列开始递归。
    • 汇总所有可能的初始状态的方案数,返回结果。

题解代码

classSolution{privatestaticfinalintMOD=1_000_000_007;// 模数,防止结果溢出publicintcolorTheGrid(intm,intn){// 计算3的幂次数组,用于后续处理颜色状态int[]pow3=newint[m];pow3[0]=1;for(inti=1;i<m;i++){pow3[i]=pow3[i-1]*3;}// 生成所有有效的列颜色状态(相邻颜色不同)List<Integer>valid=newArrayList<>();next:for(intcolor=0;color<pow3[m-1]*3;color++){for(inti=1;i<m;i++){// 检查相邻颜色是否相同if(color/pow3[i]%3==color/pow3[i-1]%3){continuenext;// 相同则跳过}}valid.add(color);// 有效状态加入列表}// 构建状态转移图:每个有效状态可以转移到哪些其他有效状态intnv=valid.size();List<Integer>[]nxt=newArrayList[nv];Arrays.setAll(nxt,i->newArrayList<>());for(inti=0;i<nv;i++){next2:for(intj=0;j<nv;j++){for(intp3:pow3){// 检查对应位置颜色是否相同if(valid.get(i)/p3%3==valid.get(j)/p3%3){continuenext2;// 相同则跳过}}nxt[i].add(j);// 可以转移的状态}}// 记忆化数组,memo[i][j]表示第i列使用状态j时的方案数int[][]memo=newint[n][nv];for(int[]row:memo){Arrays.fill(row,-1);}// 计算所有可能的初始状态的总方案数longans=0;for(intj=0;j<nv;j++){ans+=dfs(n-1,j,nxt,memo);}return(int)(ans%MOD);}// 记忆化搜索privateintdfs(inti,intj,List<Integer>[]nxt,int[][]memo){if(i==0){return1;// 基础情况:第一列}if(memo[i][j]!=-1){returnmemo[i][j];// 已计算过}longres=0;// 遍历所有可能的下一个状态for(intk:nxt[j]){res+=dfs(i-1,k,nxt,memo);}returnmemo[i][j]=(int)(res%MOD);// 存储并返回结果}}

复杂度分析

  1. 时间复杂度
    • 生成有效状态:O(m * 3^m)
    • 构建状态转移图:O(m * 3^(2m))
    • 记忆化搜索:O(n * 3^m)
    • 总体:O(n * 3^m + m * 3^(2m)),当m较小时可行
  2. 空间复杂度
    • 存储状态转移图:O(3^(2m))
    • 记忆化数组:O(n * 3^m)
    • 总体:O(n * 3^m + 3^(2m))
http://www.jsqmd.com/news/741480/

相关文章:

  • MoE与Mamba-Transformer融合的轻量化AI模型实践
  • 从线性回归到ChatGPT:逆向工程学习法拆解大语言模型
  • Mac mini养虾潮凉了?有人转投“爱马仕“,有人直接退坑
  • ok-ww终极指南:基于图像识别的鸣潮自动化战斗完整解决方案
  • 2025届必备的AI辅助论文网站推荐
  • 【仅限前200位BMS开发者的硬核调试包】:含自研C语言BMS信号注入器源码、故障注入触发库、及37个真实车规级Bug模式库(ISO 26262 ASIL-C已验证)
  • 基于MCP协议的Expo状态管理:AI原生开发新范式
  • FigmaCN:解锁中文界面,让设计工作回归母语体验
  • Godot 3集成LuaJIT插件:原理、配置与高性能游戏脚本开发实践
  • “红帽系统管理二”知识点问答题:第10章 控制启动过程
  • 大语言模型鲁棒性评估:PARROT框架与权威压力测试
  • 2026ISO27001认证咨询推荐榜:业务连续性管理体系认证、人工智能管理体系认证、信息安全管理体系认证、信息技术服务管理体系认证选择指南 - 优质品牌商家
  • 终极音频管理方案:用Audio Router实现Windows程序级音频路由
  • Python 3.15 WASM部署全链路踩坑手册,含Pyodide 0.26+、Emscripten 3.1.61兼容矩阵与内存泄漏修复补丁(仅限首批内测开发者)
  • 别再死记硬背命令了!CST Studio 2D绘图保姆级避坑指南(附排针建模实例)
  • 2026年优质洗衣机械TOP5推荐:洗涤设备价格查询/洗涤设备公司/洗涤设备前十大名牌/洗涤设备品牌/洗涤设备哪家好/选择指南 - 优质品牌商家
  • Adafruit Metro RP2350开发板解析与嵌入式开发实践
  • AI应用开发工作空间:从架构设计到工程实践的全栈解决方案
  • 【边缘计算模型瘦身黄金公式】:FLOPs↓68% + 推理延时↓4.3× + 精度损失<0.8%,Python全流程开源工具链首次公开
  • openworld.js 的一些创意,以及 openWorld.zone 未来策划建议
  • 【深度解析】Codex 从代码助手到 AI Coding Workspace:浏览器验证、权限闭环与自动化审查实战
  • 告别轮询!用STM32CubeMX给STM32F072配置ADC+DMA,实现后台无感数据采集
  • Certificate Lifecycle Management:从理论到实践的完整指南
  • 手把手教你修复iText PDF的‘trailer not found’错误(附PDF模板保护指南)
  • 从太阳镜到光纤通信:深入浅出聊聊偏振技术如何影响我们的数字生活
  • ARMv8调试寄存器详解:断点与观察点控制
  • 2026宜宾别墅搬家技术指南:宜宾喜来乐搬家/宜宾店铺搬迁/宜宾异地搬家/宜宾搬迁厂房/宜宾机器搬迁/宜宾设备搬迁/选择指南 - 优质品牌商家
  • 歌词滚动姬终极指南:免费快速制作完美LRC歌词的完整流程
  • 告别原型!AI 工程化的 3 个生死线,90% 开发者都踩过的坑
  • 部署与可视化系统:26届秋招避坑:Gradio 自定义 CSS 界面美化与异步函数解决大模型长时间推理阻塞问题