news 2026/1/14 6:38:50

A.每日一题——1411. 给 N x 3 网格图涂色的方案数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
A.每日一题——1411. 给 N x 3 网格图涂色的方案数

题目链接:1411. 给 N x 3 网格图涂色的方案数(困难)

算法原理:

解法:DFS+记忆化搜索

46ms击败15.57%

时间复杂度:O(nmk2m+1),其中 m=3 是列数,k=3 是颜色数

①整体思路:三种颜色分别用0,1,2表示,利用递归,暴力枚举每一个格子所填的颜色,从下往上填,每行从左往右填,下面Java代码的注释已详细说明

②递归核心:先从最后一行从左往右依次填充颜色,当j==3时说明当前行颜色填充完毕,转到上边一行继续填充,当全部填充完毕,也就是没有上边一行(i==0时),说明找到了一种方案数,返回1

③填充合法性:当前i行j列(i,j)的颜色不能和下边(i-1,j)和左边(i,j-1)颜色相同

④小优化:用key专门标记已深搜过的对应行数的颜色需要的方案数

将当前行坐标(i,j)+刚刚填完的前一行颜色+当前行填完的颜色放进备忘录里,从而减少递归次数

由于0,1,2每个格子颜色仅需要2个比特位,那么存储每行的信息仅需2×3=6个比特位,由于i作为行数,具体需要多少比特位不确定,因此放在一个可以自由活动的区域,也就是最前面,统一<<14个比特位即可

这14个比特位的组成:i的行数(未知比特位位数)+i的列数(j的取值0、1、2仅需2个比特位)+前一行填完的颜色(6个比特位)+当前行颜色(6个比特位)

Java代码:

class Solution { private static final int MOD=1_000_000_007; //全局memo:记忆的内容可以在不同测试数据间共享 private static Map<Integer,Integer> memo=new HashMap<>(); public int numOfWays(int n) { return dfs(n,0,0,0); } //(i,j):i行j列 //preRow:上一行(i+1行)的颜色 //curRow:当前行的颜色 private int dfs(int i,int j,int preRow,int curRow){ //如果所有格子都已涂色,说明找到了一个方案 if(i==0) return 1; //如果i行已涂色,开始对i-1行涂色,当前行作为下一个递归的前一行 if(j==3) return dfs(i-1,0,curRow,0); //参数压缩到一个int中 //int中的存储格式:当前行号+当前列号+上一行所填颜色+当前行所填颜色 //i不知道多少行,所以右移14位放最前面 //j取值为012,占两个比特位 //preRow和curRow均占2×3个比特位 int key=(i<<14)|(j<<12)|(preRow<<6)|curRow; //先往备忘录里瞅瞅 if(memo.containsKey(key)) return memo.get(key); int ret=0; //枚举(i,j)的颜色color for(int color=0;color<3;color++){ //不能和下面相邻格子(i+1,j)颜色相同 //preRow>0:先判断下一行是否有数据,有的话就要保证颜色不能相同 //(preRow>>(j*2)&3):将需要比较的颜色从里面移动到最右边再用|提取出来 //preRow存储格式:最右侧颜色标识数+中间颜色标识数+最左侧标识数 //&3:将需要比较的颜色标识数移动到最右边后,用3(二进制11)来提取出颜色 if(preRow>0&&color==(preRow>>(j*2)&3)|| //不能和左侧相邻格子(i,j-1)颜色相同 j>0&&color==(curRow>>((j-1)*2)&3)) continue; //此行还未填完,因此preRow保持不变,把当前color存入当前行curRow的对应位置 ret=(ret+dfs(i,j+1,preRow,curRow|(color<<(j*2))))%MOD; } memo.put(key,ret);//存进备忘录 return ret; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/12 15:49:54

AI实体侦测服务保姆级教程:从零开始搭建NER系统

AI实体侦测服务保姆级教程&#xff1a;从零开始搭建NER系统 1. 引言 1.1 学习目标 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;命名实体识别&#xff08;Named Entity Recognition, NER&#xff09; 是信息抽取的核心任务之一。它能够从非结构化文本中自动识…

作者头像 李华
网站建设 2026/1/12 22:36:52

年轻人为什么越来越爱“盘东西”(AI来回答)

近年来&#xff0c;“盘东西”这一原本被视为中老年文玩爱好的行为&#xff0c;正在被越来越多的年轻人所接纳甚至热衷。从盘手串、核桃到葫芦、佛手柑&#xff0c;再到乐高天珠、奥特曼公仔搭配小叶紫檀的“赛博佛珠”&#xff0c;年轻人将传统文玩解构为潮流玩具&#xff0c;…

作者头像 李华
网站建设 2026/1/13 3:35:52

Qwen2.5-7B环境配置太复杂?云端一键解决所有依赖

Qwen2.5-7B环境配置太复杂&#xff1f;云端一键解决所有依赖 引言 作为一名AI开发者&#xff0c;你是否曾经被本地部署大模型的复杂环境配置折磨得焦头烂额&#xff1f;Python版本冲突、CUDA驱动不兼容、依赖包缺失...这些问题让很多开发者望而却步。特别是当你想要尝试Qwen2…

作者头像 李华
网站建设 2026/1/12 21:32:08

没显卡怎么跑Qwen2.5?云端GPU 1小时1块,5分钟部署成功

没显卡怎么跑Qwen2.5&#xff1f;云端GPU 1小时1块&#xff0c;5分钟部署成功 引言&#xff1a;前端开发者的AI编程助手困境 作为一名前端开发者&#xff0c;你可能经常遇到这样的场景&#xff1a;正在编写React组件时突然卡在某个逻辑实现上&#xff0c;或者想快速生成一段T…

作者头像 李华
网站建设 2026/1/14 1:52:55

如何提升中文NER效率?AI智能实体侦测服务参数详解教程

如何提升中文NER效率&#xff1f;AI智能实体侦测服务参数详解教程 1. 引言&#xff1a;为何需要高效的中文命名实体识别&#xff1f; 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;命名实体识别&#xff08;Named Entity Recognition, NER&#xff09; 是信息抽…

作者头像 李华