leetcode790.多米诺和托米诺平铺
生活随笔
收集整理的這篇文章主要介紹了
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.多米诺和托米诺平铺的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日常训练训练
- 下一篇: 【天梯赛L2-016】愿天下有情人都是失