[Swift]LeetCode790. 多米诺和托米诺平铺 | Domino and Tromino Tiling

We have two types of tiles: a 2x1 domino shape, and an "L" tromino shape. These shapes may be rotated.

XX  <- domino

XX  <- "L" tromino
X

Given N, how many ways are there to tile a 2 x N board? Return your answer modulo 10^9 + 7.

(In a tiling, every square must be covered by a tile. Two tilings are different if and only if there are two 4-directionally adjacent cells on the board such that exactly one of the tilings has both squares occupied by a tile.)

Example:
Input: 3
Output: 5
Explanation:
The five different ways are listed below, different letters indicates different tiles:
XYZ XXZ XYY XXY XYY
XYZ YYZ XZZ XYY XXY

Note:

  • N  will be in range [1, 1000].


有两种形状的瓷砖:一种是 2x1 的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。

XX  <- 多米诺

XX  <- "L" 托米诺
X

给定 N 的值,有多少种方法可以平铺 2 x N 的面板?返回值 mod 10^9 + 7。

(平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。)

示例:
输入: 3
输出: 5
解释:
下面列出了五种不同的方法,不同字母代表不同瓷砖:
XYZ XXZ XYY XXY XYY
XYZ YYZ XZZ XYY XXY

提示:

  • N  的范围是 [1, 1000]


Runtime: 4 ms

Memory Usage: 19 MB

 1 class Solution {
 2     func numTilings(_ N: Int) -> Int {
 3         switch N
 4         {
 5             case 0:
 6             return 1
 7             case 1,2:
 8             return N
 9             default:
10             break
11         }
12         var M:Int = Int(1e9) + 7
13         var dp:[Int] = [Int](repeating:0,count:N + 1)
14         dp[0] = 1
15         dp[1] = 1
16         dp[2] = 2
17         for i in 3...N
18         {
19             dp[i] = (dp[i - 1] * 2 + dp[i - 3]) % M
20         }
21         return dp[N]
22     }
23 }


4ms

 1 class Solution {
 2     func numTilings(_ N: Int) -> Int {
 3         let MOD = 1000000007
 4         if N == 1 { return 1 }
 5         if N == 2 { return 2 }
 6         var dp = [Int](repeating: 0, count: N+1)
 7         dp[0] = 1; dp[1] = 1; dp[2] = 2
 8         for i in 3...N {
 9             dp[i] = (2*dp[i-1] + dp[i-3])%MOD
10         }
11         return dp[N]
12     }
13 }

原文地址:https://www.cnblogs.com/strengthen/p/10545719.html

时间: 2024-07-31 05:35:17

[Swift]LeetCode790. 多米诺和托米诺平铺 | Domino and Tromino Tiling的相关文章

790. 多米诺和托米诺平铺

public int numTilings(int N) { // dp转移方程: dp(n) = 2 * dp(n-1) + dp(n-3), 时间复杂度O(N), 空间复杂度O(1) if (N == 0) { return 0; } if (N == 1) { return 1; } if (N == 2) { return 2; } int mod = (int)(Math.pow(10, 9) + 7); int n1 = 1, n2 = 2, n3 = 5; for (int i =

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

Java算法分析2—————几种排序&amp;汉诺塔算法

一:插入排序 /* * 插入排序 */ /* * 原序列 [12] 15 9 20 6 31 24 * 第0趟 [12 15] 9 20 6 31 24 * 第1趟 [9 12 15] 20 6 31 24 * 第2趟 [9 12 15 20] 6 31 24 * 第3趟 [6 9 12 15 20] 31 24 * n个数,一共需要多少趟?n个数,n-1趟 * 第0趟,把1位置的数,和1位置之前的数进行比较,按大小顺序排列 * 第1趟,把2位置的数,和2位置之前的数进行比较,按大小顺序排列 .

初识汉诺塔问题

汉诺塔 汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. ——引自维基百科 若给汉诺塔传说中三根柱子分别用英文字母a,b,c命名,其中只有a柱子摆放n片圆盘(1<=n<=100000), 若要把a柱子上的所有圆盘转移到c柱子上,问最少需要移动多少次圆盘. 移动圆盘的规则如下: 每

《爸爸去哪儿3》:刘烨是如何教育诺一的?

在2015年9月11日<爸爸去哪儿>中,诺一在行为方面有一些令人不满意地方,刘烨对儿子的教育的方式值得借鉴. 第一个场景,刘烨在向村民打听要住的地方时,诺一反复叫着‘爸爸,爸爸,还是给你吃吧’,不断得打扰刘烨与村民的对话.事后,刘烨蹲下来严肃地说:“诺一.诺一,爸爸在跟别人的讲话的时候,不要一直打断,这是咱们家里一直在讲的,对不对?这不礼貌,这是对父母的不尊重,知道吗?” 蹲下来,让孩子觉得你并不是高高在上,在身体语言上,表达了对孩子的接受,哪怕是在批评他的时候,他也能感受到自己只是行为上不被

两个递归程序(数组最大元素,汉诺塔)

1.递归返回数组中最大元素 //返回数组中最大元素 int findMax(int a[], int n) { int next = 0; if (n == 1) return a[0]; next = findMax(&a[1], n-1); return a[0]>next ? a[0] : next; } 2.汉诺塔 /* 汉诺塔:把盘子从A驻移动到C柱,大盘子时刻不能在小盘子之上 输入:n(盘子数目) 输出:步骤 */ int hanoid(char A, char B, char

【数据结构与算法】递归汉诺塔

汉诺塔 汉诺塔是根据一个传说形成的数学问题(关于汉诺塔): 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 递归汉诺塔 解题思路: 可以把问题简化成2个盘子的情况,如:A上有两个盘子,B和C是空的.如果要把A的两个盘子全部移动到C,需要经过以下步骤: 1.A移动一个盘子到B 2.A移动一个盘

算法——汉诺塔问题(递归典型)

汉诺塔 汉诺塔是一个发源于印度的益智游戏,也叫河内塔.相传它源于印度神话中的大梵天创造的三个金刚柱,一根柱子上叠着上下从小到大64个黄金圆盘.大梵天命令婆罗门将这些圆盘按从小到大的顺序移动到另一根柱子上,其中大圆盘不能放在小圆盘上面.当这64个圆盘移动完的时候,世界就将毁灭. 算法分析: 一阶汉诺塔的移动,显而易见,从 A->C 然后,我们可以探讨二阶与一阶的联系: 不光是对于二阶,其实N阶汉诺塔相当于执行了三大步骤:  1.在ACB的顺序下执行了(N-1)阶汉诺塔的移法 2.从A->C移动了

用python turtle实现汉诺塔的移动

1.汉诺塔 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 2.算法介绍 当盘子的个数为n时,移动的次数应等于2^n – 1 后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了.首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序