LeetCode——1931. 用三种不同颜色为网格涂色[Painting a Grid With Three Different Colors][困难]——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 动态规划
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

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

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

示例 1:

输入:m = 1, n = 1
输出:3

示例 2:

输入:m = 1, n = 2
输出:6

示例 3:

输入:m = 5, n = 5
输出:580986

提示:

  • 1 <= m <= 5
  • 1 <= n <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/painting-a-grid-with-three-different-colors
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 动态规划

(1)思路

先预处理得到单行的所有有效涂色方案,再进一步计算得到每种单行方案对应的有效邻行方案。在此基础上,结合动态规划方法,逐行求解各种涂色状态对应的方案总数,最后统计得到总方案数。

(2)代码

class Solution {static int mod = (int)1e9 + 7;public int colorTheGrid(int m, int n) {//获得单行所有涂色方案Map<Integer, List<Integer>> line = new HashMap<>();//用0、1、2表示各个网格的颜色,key为方案对应的数值,value为方案对应的数组int range = (int)Math.pow(3, m);//对单行的m个网格,可能的取值范围为[0, 3^m)for (int i = 0; i < range; i++) {//遍历可能的数值//获得数值对应的数组List<Integer> list = new ArrayList<Integer>();int num = i;for (int j = 0; j < m; j++) {list.add(num % 3);num /= 3;}//确认该数组中是否存在相邻位置颜色相同boolean valid = true;for (int j = 1; j < m; j++) {if (list.get(j - 1) == list.get(j)) {valid = false;break;}}if (valid == true)//相邻网格颜色均不同,为有效方案,加入哈希表line.put(i, list);}//预处理得到每种单行方案对应的有效邻行方案Map<Integer, List<Integer>> adj = new HashMap<>();//key为单行方案的数值,value为所有有效邻行方案的数值Iterator it1 = line.entrySet().iterator();while (it1.hasNext()) {//遍历单行的方案Map.Entry entry1 = (Map.Entry)it1.next();int num1 = (int)entry1.getKey();List<Integer> list1 = (List<Integer>)entry1.getValue();adj.put(num1, new ArrayList<Integer>());Iterator it2 = line.entrySet().iterator();while (it2.hasNext()) {//遍历邻行的方案Map.Entry entry2 = (Map.Entry)it2.next();int num2 = (int)entry2.getKey();List<Integer> list2 = (List<Integer>)entry2.getValue();boolean match = true;for (int i = 0; i < m; i++) {//确认二者是否可以相邻if (list1.get(i) == list2.get(i)) {match = false;break;}}if (match == true)//将有效邻行加入哈希表对应的值空间adj.get(num1).add(num2);}}//动态规划,逐行求解方案数long[] dp = new long[range];//上一行各种涂色方案对应的总方法数for (int i = 0; i < range; i++)dp[i] = (line.containsKey(i)) ? 1 : 0;//初始化for (int i = 1; i < n; i++) {//从第二行开始动态规划long[] newDp = new long[range];//新一行各种涂色方案对应的总方法数Arrays.fill(newDp, 0);for (int j = 0; j < range; j++) {if (adj.containsKey(j)) {//该方案有效for (int lastLine : adj.get(j))//遍历有效的相邻方案newDp[j] = (newDp[j] + dp[lastLine]) % mod;//总方法数累加}}for (int j = 0; j < range; j++)//复制到dp数组dp[j] = newDp[j];}//统计答案,即最后一行各种涂色方案对应的总方法数的总和long ans = 0;for (int i = 0; i < range; i++)ans = (ans + dp[i]) % mod;return (int)ans;}
}

(3)结果

执行用时 :54 ms,在所有 Java 提交中击败了 65.04% 的用户;
内存消耗 :38.1 MB,在所有 Java 提交中击败了 56.37% 的用户。

三、其他

暂无。

LeetCode——1931. 用三种不同颜色为网格涂色(Painting a Grid With Three Different Colors)困难]——分析及代码(Java)相关推荐

  1. LeetCode——552. 学生出勤记录 II(Student Attendance Record II)[困难]——分析及代码(Java)

    LeetCode--552. 学生出勤记录 II[Student Attendance Record II][困难]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 ( ...

  2. LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)

    LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...

  3. LeetCode——1849. 将字符串拆分为递减的连续值(Splitting a String Into Descending Consecutive Val..)[中等]——分析及代码(Java)

    LeetCode--1849. 将字符串拆分为递减的连续值[Splitting a String Into Descending Consecutive Values][中等]--分析及代码[Java ...

  4. LeetCode——218. 天际线问题(The Skyline Problem)[困难]——分析及代码(Java)

    LeetCode--218. 天际线问题[The Skyline Problem][困难]--分析及代码[Java] 一.题目 二.分析及代码 1. 扫描线 + 优先队列 (1)思路 (2)代码 (3 ...

  5. LeetCode——1803. 统计异或值在范围内的数对有多少(Count Pairs With XOR in a Range)[困难]——分析及代码(Java)

    LeetCode--1803. 统计异或值在范围内的数对有多少[Count Pairs With XOR in a Range][困难]--分析及代码[Java] 一.题目 二.分析及代码 1. 暴力 ...

  6. arduino开关控制RGB三色小灯程序,按一下亮一个颜色,松开熄灭,三种不同颜色,程序代码,以及连线图。

    arduino 接线 代码: int redPin= 9; int greenPin = 10; int bluePin = 11; int button = 2; // 定义按键位管脚 int bu ...

  7. 三种近场通信技术的特点以及对未来近场通信技术的应用场景进行分析与预测

    三种近场通信技术的特点以及对未来近场通信技术的应用场景进行分析与预测 第一种:蓝牙 Bluetooth Classic无线电,也被称为Bluetooth 基本速率/增强数据速率(BR/EDR),是一种 ...

  8. LeetCode——517. 超级洗衣机(Super Washing Machines)[困难]——分析及代码(C++)

    LeetCode--517. 超级洗衣机[Super Washing Machines][困难]--分析及代码[C++] 一.题目 二.分析及代码 1. 贪心 (1)思路 (2)代码 (3)结果 三. ...

  9. 口袋中有红、黄、蓝、白、黑5种颜色的球若干个,每次从口袋中先后取出3个球,求得到三种不同颜色的球的可能取法,并输出每种排列的情况

    算法分析: 球色只能是五种颜色之一,而且要判断各球是否同色,可用枚举类型变量处理. 设某次取出的三个球的颜色分别为i,j,k.根据题意,i,j,k,分别是5种色球之一,并要求三种颜色互不相同{可用穷举 ...

  10. 电路交换、报文交换、分组交换三种数据交换方式的特点、优点、应用场景以及技术对比分析

    1.电路交换 电路交换是指在呼叫双方在开始通话之前,首先由交换设备在两者之间建立一条专用电路,并且在整个通话期间独占该条电路直到结束.其通信过程一般分为:电路建立阶段.通信阶段.电路拆除阶段三部分.常 ...

最新文章

  1. html计时节日,原生js实现节日时间倒计时功能
  2. Cordova实战培训
  3. 设计模式整理之简单工厂
  4. 图片夹_各种变调夹的优缺点、原理和使用方法
  5. 别人的趋势不一定是你的未来
  6. 2020-12-05
  7. Java之BIO网络编程
  8. 中国十大徒步路线,你走过几个?_我是亲民_新浪博客
  9. js和css压缩工具
  10. 纸短情长用计算机破出来的数字,纸短情长简谱数字大全 一看就会的简谱
  11. Typora-PicGo-SMMS图床(Mac电脑和windows电脑)
  12. 2023广州大米展会
  13. video 满屏显示_JiaoZiVideoPlayer 全屏显示不全
  14. Webstrom取消下划线
  15. visual studio 官网下载地址 vs2019/vs2017/vs2015企业版、专业版、社区版官网下载地址
  16. 刷百度下拉那个词与百度快排点击原理是什么?做快排网站降权怎么办?
  17. 北航软件测试与质量管理,北航软件学院质量与测试专业.doc
  18. C#/VB.NET 对Excel单元格填充背景色
  19. 你真的会做项目经理吗
  20. mindmaster

热门文章

  1. 关闭jupyter notebook报错:python.exe-应用程序错误
  2. 如何做一个优秀的管理者
  3. 蓝牙耳机排名前十:618性价比超高的真无线蓝牙耳机推荐!
  4. 29岁程序员,该怎么在写作、沟通、能力方面提升自己?
  5. 科学研究的方法-笔记01-如何提出科学研究问题
  6. 又是一年春来到,祝大家有个好的开始。
  7. 如何利用wordpress搭建一个免费博客
  8. pidgin linux,Linux下的IM(Pidgin,EVA,QQlinux,...)
  9. 深圳哪个驾校比较好?
  10. 问题解决:Unable to establish SSL connection.