动态规划-状态压缩-三状态-5383. 给 N x 3 网格图涂色的方案数
时间:2020-04-12
本文章向大家介绍动态规划-状态压缩-三状态-5383. 给 N x 3 网格图涂色的方案数,主要包括动态规划-状态压缩-三状态-5383. 给 N x 3 网格图涂色的方案数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
2020-04-12 20:44:30
问题描述:
你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同)。
给你网格图的行数 n 。
请你返回给 grid 涂色的方案数。由于答案可能会非常大,请你返回答案对 10^9 + 7 取余的结果。
示例 1:
输入:n = 1 输出:12 解释:总共有 12 种可行的方法:
提示:
n == grid.length
grid[i].length == 3
1 <= n <= 5000
问题求解:
可以使用状态压缩来进行求解,主要难点在于这里是三状态的,需要使用2bit来进行表示。
时间复杂度:O(n * 64 * 64)
int[][] dp = new int[5050][64]; int mod = (int)1e9 + 7; public int numOfWays(int n) { for (int i = 0; i < 64; i++) { int c1 = get_color(i, 0); int c2 = get_color(i, 1); int c3 = get_color(i, 2); if (c1 == 3 || c2 == 3 || c3 == 3) continue; if (c1 == c2 || c2 == c3) continue; dp[0][i] = 1; } for (int i = 1; i < n; i++) { for (int curr = 0; curr < 64; curr++) { int c1 = get_color(curr, 0); int c2 = get_color(curr, 1); int c3 = get_color(curr, 2); if (c1 == 3 || c2 == 3 || c3 == 3) continue; if (c1 == c2 || c2 == c3) continue; for (int prev = 0; prev < 64; prev++) { int v1 = get_color(prev, 0); int v2 = get_color(prev, 1); int v3 = get_color(prev, 2); if (v1 == 3 || v2 == 3 || v3 == 3) continue; if (v1 == v2 || v2 == v3) continue; if (v1 == c1 || v2 == c2 || v3 == c3) continue; dp[i][curr] = (dp[i][curr] + dp[i - 1][prev]) % mod; } } } int res = 0; for (int i = 0; i < 64; i++) { res = (res + dp[n - 1][i]) % mod; } return res; } private int get_color(int num, int idx) { return (num >> 2 * idx) & 3; }
原文地址:https://www.cnblogs.com/hyserendipity/p/12687507.html
- 好用的前端页面性能检测工具—sitespeed.io
- 计算机程序的思维逻辑 (13) - 类
- 新浪微博爬虫最新分享
- Unity Application Block 3月12 发布的版本
- HTTPS静态服务搭建过程详解
- 基于Webkit的浏览器关键渲染路径介绍
- CodePlex 全面支持Subversion/TortoiseSVN
- 计算机程序的思维逻辑 (11) - 初识函数
- Android WebView 调试方法
- Python开发微信公众号后台(系列一)
- Consul最常用的命令和接口api
- webpack的Hot Module Replacement运行机制
- 如何使用Node.js编写命令工具——以vue-cli为例
- SpringBoot编写自定义的starter
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel5.4框架使用socialite实现github登录的方法
- PHP删除字符串中非字母数字字符方法总结
- 实例讲解php将字符串输出到HTML
- PHP的mysqli_stat()函数讲解
- php中访问修饰符的知识点总结
- 浅谈keras 模型用于预测时的注意事项
- 使用Keras预训练好的模型进行目标类别预测详解
- keras输出预测值和真实值方式
- 对python pandas中 inplace 参数的理解
- PHP基于GD2函数库实现验证码功能示例
- PHP合并两个或多个数组的方法
- PHP的mysqli_set_charset()函数讲解
- PHP常见加密函数用法示例【crypt与md5】
- PHP的mysqli_sqlstate()函数讲解
- PHP Laravel中的Trait使用方法