多米诺和托米诺平铺
问题
有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。
给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 + 7 取模 的值。
平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。
示例
输入: n = 3 输出: 5 解释: 五种不同的方法如上所示。
示例 2:
输入: n = 1 输出: 1
思想
动态规划方法:定义当前状态最近的三种状态,其中status1 表示dp[i-3],status2 表示 dp[i-2],status3 表示dp[i-1]。curstatus 表示dp[i],状态转移公式可以写成 curstatus = ((2 * status3) + status1);
代码
func numTilings(n int) int { const MOD = 1E9 + 7 if n == 0 { return 1 } if n == 1 || n == 2 { return n } //动态规划三种状态 status1,status2,status3 := 1,1,2 var curStatus int for i := 3; i <= n; i++ { curStatus = ((2 * status3) % MOD + status1) % MOD status1,status2,status3 = status2,status3,curStatus } return status3 }
浙公网安备 33010602011771号