4kyu Domino Tiling - 3 x N Board

题目背景:

A domino is a rectangular block with 2 units wide and 1 unit high. A domino can be placed on a grid in two ways: horizontal or vertical.

## or ##

You have infinitely many dominoes, and you want to fill a board that is N units wide and 3 units high:

<---   N   --->
###############
###############
###############

The task is to find the number of ways you can fill the given grid with dominoes.

The Twist
But you quickly realize that the answer is zero for any odd N, because (obviously) you can’t cover odd number of cells with dominoes! So you decide to introduce one unit block (1 unit wide and 1 unit high) to cover the final gap when needed (you don’t need this block when N is even).

The following shows some possible tilings for N = 5. Note that, unlike my previous Kata, the numbers do not represent the colors (they are just for convenience). Also note that the unit block (marked as ‘X’) can be placed anywhere on the board, making the answers for odd numbers way higher than even ones.

11255   1122X   14456
3X267   33447   13356
34467   55667   22X77

Since the answer will be very large, please give your answer modulo 12345787.

题目分析:

多米诺 2 * 1 拼图问题其实是一个很经典的递归问题,本道题可以说是常见的多米诺问题中最难的一种,虽然只是递归问题,不过题目本身的分析难度仍旧相当大,接下来我将从最简单的情况起步慢慢地分析:

  • 情景一

首先分析最简单的情况,即N * 2的情况:

<---   N   --->
###############
###############

如图可以找到递归关系,即 An = An-1 + An-2,也就是大名鼎鼎的斐波那契数列,初始化 A0 = A1 = 1,由此便可以轻易地码出代码。

  • 情景二

N只是偶数,高度为3的情况。
关于N只是偶数的情况在Geeksforgeeks有详细的解答,此处我就直接盗图orz。从最终的状态分析,最后一列上呈现的状况只可能是如下三种状态:

而如下两种情况不可能出现在最后一列中: 于是可以有: 那么得到第一步的递推关系: An = An-2 + Bn-1 + Cn-1,因为Bn 和 Cn其实本质上是镜面对称的,所以可以说Bn-1 = Cn-1,则有 An = An-2 + 2 * Bn-1,再分析Bn: 得到Bn的递推关系是:Bn = An-1 + Bn-2。 于是最终的递推关系是:

An = An-2 + 2 * Bn-1
Bn = An-1 + Bn-2

初始情况是:

A0 = 1, A1 = 0
B0 = 0, B1 = 1

据此可以码出最终的代码。

  • 情景三

N既可能是偶数有可能是奇数,同时高度为3,即本题中的情况:
首先依据情景二中的情况分析,当N为偶数时,从偶数下标开始递推的话,有: A偶 = A偶 + B奇; B奇 = A偶 + B奇,可以发现对于N为偶数的情况时,递推关系是沿着A偶 及 B奇的方向递推的,所以我们此时应该分析的是A奇和B偶的情况:

  1. 当A奇时,说明1 * 1 的方块还没使用,所以说可以考虑到1 * 1的方块使用情况分析:

即 An = Bn + Cn + An-2 + Bn-1 + Cn-1,从此处就可以发现,当Bn、Cn的下标为奇时,说明1*1的方块已经使用了,所以我们需要考虑的是B偶的情况:

  1. 当B偶时:

即 Bn = An-1 + An-2 + Cn-1 + Bn-2 这样得到的最后的递推公式:

1. n为偶时:
An = An-2 + 2 * Bn-1
Bn = An-1 + An-2 + Bn-1 + Bn-2
2. n为奇时:
An = An-2 + 2 * Bn + 2 * Bn-1
Bn = An-1 + Bn-2

初始情况是:

A0 = 1, A1 = 2
B0 = 0, B1 = 1

AC代码:

# segment the pics and find the law
def countWays(n): A = [0] * (n + 1) B = [0] * (n + 1) A[0] = 1A[1] = 2B[0] = 0B[1] = 1for i in range(2, n + 1): if (i % 2):B[i] = (A[i - 1] + B[i - 2]) % 12345787A[i] = (A[i - 2] + 2 * B[i] + 2 * B[i - 1]) % 12345787else:A[i] = (A[i - 2] + 2 * B[i - 1]) % 12345787B[i] = (A[i - 1] + A[i - 2] + B[i - 1] + B[i - 2]) % 12345787return A[n]def three_by_n(n):return countWays(n)

4kyu Domino Tiling - 3 x N Board相关推荐

  1. python高级练习题:多米诺平铺 - 5×2N局【难度:4级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶

    python高级练习题:多米诺平铺 - 5×2N局[难度:4级]: 请还检查了在[多米诺拼接系列]其他练习题(https://www.codewars.com/collections/5d19554d ...

  2. Domino piling

    文章目录 一.Domino piling 总结 一.Domino piling 本题链接:Domino piling 题目: A. Domino piling time limit per test2 ...

  3. Team Silver_Bullet 训练记录

    Team members Vec Grunt henryrabbit To do list team:起队名 每周组队训练 补题 Vec: Grunt:切题,切题,切更多的题!做好切所有类型题的觉悟! ...

  4. 790. Domino and Tromino Tiling

    文章目录 1 题目理解 2 动态规划 2.1只有一种板 2.2 有两种板 1 题目理解 We have two types of tiles: a 2x1 domino shape, and an & ...

  5. leetcode 790. Domino and Tromino Tiling | 790. 多米诺和托米诺平铺(暴力递归->DP)

    题目 https://leetcode.com/problems/domino-and-tromino-tiling/ 题解 比较像剑指 offer 里的一道矩形填充题,一看就是个 dp,见草稿: 经 ...

  6. codeforces 1567 A. Domino Disaster

    本场比赛其他题目的题解 A. Domino Disaster B. MEXor Mixup C. Carrying Conundrum D. Expression Evaluation Error E ...

  7. Blender多米诺骨牌动画学习教程 The Impossible Domino Run in Blender

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小:8.53 GB 含课程文件 |时长:8h 20 ...

  8. Linux下搭建Lotus Domino集群

    Linux下搭建Lotus Domino 集群 本文内容是Linux平台下Lotus Domino服务器部署案例(http://chenguang.blog.51cto.com/350944/1334 ...

  9. Codeforces Round #698 (Div. 2) D. Nezzar and Board(一步步推出来,超级清晰,不猜结论,看不懂来打我 ~ 好题 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! D - Nezzar and Board Problem A Nezzar and Board 我们在黑板上写了 nnn 个数,x1,x2 ...

最新文章

  1. 使用tmpfs缓存文件提高性能
  2. vue中地图怎么标记数据库传过来的点_【Point小数点 图表挑战总结03】如何使用六边形网格地图(下)...
  3. Go语言 ProtoBuf 序列化和反序列化
  4. DnCNN论文阅读笔记【MATLAB】
  5. matlab函数用法积累
  6. 爱立信携Batelco完成巴林首次5G测试
  7. Spring面试问答
  8. Bootstraphead里的内容
  9. 阿里云数据盘分区并挂载
  10. oracle数据库安装——最详细全步骤详解
  11. 火焰检测的相关步骤及算法综述
  12. VARCHART XGantt开发者许可证
  13. 计算机考试表格中的透视图怎么弄,职称计算机考试:创建数据透视表
  14. My97DatePicker时间控件在asp.net的应用
  15. nokia5200中使用ucweb浏览器
  16. Zookeeper框架Curator使用
  17. 投稿论文图片分辨率达不到要求的解决方案
  18. 从系统托盘中删除Synaptics触摸板图标
  19. 【人脸识别】基于dlib库实现人脸特征值提取
  20. 今天起,属于Windows 7的时代结束了...

热门文章

  1. 链表的有序集合_JAVA
  2. 数据结构实验之栈与队列四:括号匹配
  3. 数据结构与算法(2)——栈和队列
  4. 白话阿里巴巴Java开发手册(编程规约)
  5. 教你认清MVC,MVP和MVVM
  6. 数据库范式解析(1NF 2NF 3NF BCNF)
  7. 潘天佑博士2014微软学生夏令营演讲:如何培养领导力
  8. 牛顿方法、指数分布族、广义线性模型—斯坦福ML公开课笔记4
  9. 《Effective STL》学习笔记(第四部分)
  10. 大话设计模式(十四 设计模式不能戏说!设计模式怎就不能戏说?)