- Tri Tiling
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
In how many ways can you tile a 3xn rectangle with 2x1 dominoes?
- 3 -
Here is a sample tiling of a 3x12 rectangle. Input
Input consists of several test cases followed by a line containing -1. Each test case is a line containing an
integer 0 ≤ n ≤ 30. Output
For each test case, output one integer number giving the number of possible tilings. Sample Input
2
8
12
-1
Sample Output
3
153
2131
3*n 的 图 案 的 拼 法 大 致 可 以 分 为 下 面 两 种

对于上图中图案的左半部分如下所示

用一个二维数组 dp[i][j]来表示组成上图中两图案的方法数,设上图中两图形长
度均为 n,则组成左边的方案数为 dp[n][0]右边的为 dp[n][1]
则可以得出
- 10 -
dp[2][0]=3;
dp[2][1]=2;
令上图中左边的图形为图形 1,右边的图形为图形 2
则对于 3n 的图案可分为两个部分,一个是由 3(n-2)的图案和 32 的图案直接
拼出来,这部分的方案数为 dp[n-2][0]3,而第二种则是由长度为 n-2,但形状为
图形 2 所示的图案组合而成,而要注意的是,这个图案在拼装的时候不能组成
3n-2 的图案,因为这种情况在之前已经计算过了,所以就只有一种拼法,所
以可得状态转移方程 dp[n][0]=dp[n-2][0]3+dp[n-2][1],而对于长度为 n 的图案
二则有两种拼法,一种是用 3(n-2)来拼,由于图案的突出可能在上边也可能在
下边,所以这样的是 2dp[n-2][0],另一种方法是用长度为 n-2 的图案二来拼,
还是要注意不要拼成 3n-2,所以只有一种拼法,所以可得状态转移方程
dp[n][1]=2dp[i-2][0]+dp[i-2][1],这样的话问题就基本解决了
#include<iostream>
#include<cstring>
using namespace std;
long long int dp[15][2];
int main(){
int n;
memset(dp,0,sizeof(dp));
while(cin>>n&&n!=-1){
dp[2][0]=3;
dp[2][1]=2;
dp[0][0]=1;
for(int i=3;i<=n;i++){
if(i%2==1){
dp[i][0]=0;
dp[i][1]=0;
}
else{
dp[i][1]=2*dp[i-2][0]+dp[i-2][1];
dp[i][0]=3*dp[i-2][0]+dp[i-2][1];
}
}
cout<<dp[n][0]<<endl;
memset(dp,0,sizeof(dp));
}
}
相关文章:
-
2022-12-23
-
2022-02-02
-
2021-08-17
-
2021-06-01
-
2021-05-11
-
2021-11-10
-
2021-12-01
-
2022-12-23