日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

790. Domino and Tromino Tiling

發布時間:2023/12/10 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 790. Domino and Tromino Tiling 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1 題目理解
  • 2 動態規劃
    • 2.1只有一種板
    • 2.2 有兩種板

1 題目理解

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].

輸入:正整數N
輸出:能夠組成2xN 的一個長方形,有幾種方式。
規則:積木類型有兩種:一種是XX,domino板;一種是
XX
X
tromino板。返回的結果應該是對109+710^9 + 7109+7取余。
這個題目,從題目理解就很費解。還是看了花花醬的解釋才明白怎么回事。一種積木是長方形,一種積木是L行。每次是在前一個狀態上,追加這兩種板的其中一種或者兩種。最終拼成一個2xn的長方形。

2 動態規劃

2.1只有一種板

如果只有一種domino板,有多少種方式鋪滿一個2xn的長方形呢?

畫圖之后發現dp[i] = dp[i-1]+dp[i-2],是一個菲波那切數列。初始化:dp[0]=1,dp[1]=1。答案是:dp[n]。

2.2 有兩種板

如果有兩種版,domino板和tromino板。
在處理第i步的時候,對于前i-1形成的圖像可能分成三種情況。
一種情況是前i-1步以后,第i-1列,上下兩行都有板。

一種情況是前i-1步以后,第i-1列,上面一行有板。(看灰色部分)

一種情況是前i-1步以后,第i-1列,下面一行有板。(看灰色部分)

我們定義數組in[N+1][3] dp。dp[i][0]表示第i列,上下行都有板。dp[i][1]表示第i列,上面行有板。dp[i][2]表示第i列,下面行有板。

那么分析要到達dp[i][0]有哪些可能性,或者說從哪些狀態能到達dp[i][0]。

如圖所示,第一個需要一塊domino板,第二個需要2塊domino板,第3個需要一塊tromino板,第4個需要一塊tromino板。

所以遞歸方程為:dp[i][0] = dp[i-1][0] + dp[i-2][0] + dp[i-1][1] + dp[i-1][2]

接著分析要到達dp[i][1]有哪些可能性,或者說從哪些狀態能到達dp[i][1]。

遞歸方程:dp[i][1] = dp[i-2][0] + dp[i-1][2]

最后分析要到達dp[i][2]有哪些可能性,或者說從哪些狀態能到達dp[i][2]。

遞歸方程:dp[i][2] = dp[i-2][0] + dp[i-1][1]

編碼解決

class Solution {public int numTilings(int N) {long[][] dp = new long[N+1][3];dp[0][0] = dp[1][0] = 1;int kMod = 1000000007;for(int i=2;i<=N;i++){dp[i][0] = (dp[i-1][0] + dp[i-2][0] + dp[i-1][1] + dp[i-1][2])%kMod;dp[i][1] = (dp[i-2][0] + dp[i-1][2])%kMod;dp[i][2] = (dp[i-2][0] + dp[i-1][1])%kMod;}return (int)dp[N][0];} }

時間復雜度O(n)

總結

以上是生活随笔為你收集整理的790. Domino and Tromino Tiling的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。