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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode790.多米诺和托米诺平铺

發布時間:2024/1/18 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode790.多米诺和托米诺平铺 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大意

有兩種形狀的瓷磚:一種是 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來說,要想全部平鋪:

  • f(n-1)全部平鋪的情況下,加上一個2*1的塊即可,1種方式;
  • f(n-2)全部平鋪的情況下,加上兩個橫著的12塊即可,一種方式(注意,這里不能加入兩個豎著的21塊,因為當n-2完成后,如果加上一個豎著的塊,那么n-1也全部平鋪完成了,和f(n-1)就重復計算了,因此n-2時僅有一種方式);
  • f(n-3)全部平鋪的情況下,只能通過放置兩個’L’塊平鋪,兩個L塊可以上下顛倒,因此有2種方式從f(n-3)平鋪成f(n)。注意:如果放置一個21塊,則相當于重復計算了f(n-2),如果放置兩個12塊,則相當于重復計算了f(n-1)。
  • 綜上所述,我們在通過f(x)平鋪f(n)時,x+1~n-1列不能有完成拼好的,否則就重復計算了

因此:從f(x)平鋪f(n)時,我們先放置一個L型塊,然后x+1~n-1列全部用12的塊填充,這樣就會使得每一列都是錯位的。填充完畢后,n-1列中有1個格子被填充了,另一個格子空著,同時第n列空著。此時再用另一個L塊填充即可。 (對這種方法上下翻轉可以形成另一種方案,因此需要2)

遞推公式為:f(n)=f(n-1)+f(n-2)+2*(f(n-3)+…+f(0))。 另一方面f(n-1)=f(n-2)+f(n-3)+2*(f(n-4)+…+f(0))。將第二個公式帶入第一個公式中,化簡得到:f(n)=2*f(n-1)+f(n-3)

注意:代碼中可以僅通過幾個變量來完成計算

class Solution { public:int numTilings(int N) {if (N <= 1)return 1;if (N == 2)return 2;vector<int> dp(N + 1, 0);dp[0] = 1;dp[1] = 1;dp[2] = 2;for (int i = 3; i <=N; ++i){dp[i] = (2 * dp[i - 1] % 1000000007 + dp[i - 3] % 1000000007) % 1000000007;}return dp.back();} };

總結

以上是生活随笔為你收集整理的leetcode790.多米诺和托米诺平铺的全部內容,希望文章能夠幫你解決所遇到的問題。

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