瓷砖铺满2xN格子的方式数
用一字型两格或L字型三格的瓷砖铺满2xN格子的方式数。
int numTilings(int N) {
// 两个相互依赖的递推式:设d[i]表示铺满2*i格子的方式数,t[i]表示缺右上角或右下角铺满2*i-1格子的方式数
// d[i] = d[i-1] /* 一竖 */ + d[i-2] /* 两横 */ + 2 * t[i-1] /*两种不同朝向的L型*/
// t[i] = t[i-1] /* 一横 */ + d[i-2] /* 一个L型 */
// 初始 d[1]=1, d[2]=2, t[1]=0, t[2]=1(虽然有缺右上角或右下角两种情况,但对确定的缺角情况只有一种L型)
const int MOD = 1e9 + 7;
vector<int> d(N + 1, 0), t(N + 1, 0);
d[1] = 1, d[2] = 2, t[1] = 0, t[2] = 1;
for (int i = 3; i <= N; i++) {
d[i] = (d[i-1] + d[i-2] + 2l * t[i-1]) % MOD;
t[i] = (t[i-1] + d[i-2]) % MOD;
}
return d[N];
}