POJ 2663 Tri Tiling

Tri Tiling

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 10306   Accepted: 5237

Description

In how many ways can you tile a 3xn rectangle with 2x1 dominoes? 
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

这是一维动态规划的一道非常经典的题目

如果n为奇数,必然无解。

当n为偶数时,一个比较直观的思路就是把大矩形用竖线切出左边一部分,然后递归求解,就像UVA_10359那样,直接考虑最左边一个小矩形是如何构成的我们就可以递归得到f(n)递推式。

虽然这个题目乍看上去小矩形似乎拼法比较多,而且要拼出一个不能再用竖线切分的小矩形似乎拼的方法也并不直观。但如果我们在纸上多画一画的话,对于拼任意一个横向边长为x的不可再用竖线切分的小矩形,如果x为2,显然有3种拼法,如果x为大于2的偶数,那么只有2种拼法。

至于如果x>2为什么只有两种拼法,我们不妨实际拼一下。首先第一列肯定只有两种情况,第一种是一个横的在上面,然后一个竖的在左下方,第二种是一个横的在下面,然后一个竖的在左上方,因为两种情况对称,我们只讨论第一种情况。

现在已经拼好两个了,如果横的下面再放一个竖的,那么显然这个就成了一个x=2的小矩形了,那么最后拼出来的就不符合我们前面说的不可再用竖线切分的特征了,因此横的下面也即竖的右边,只能再放两个横的,放完两个横的我们就发现两个横的上面有一个小正方形区域,这个区域只能楔进去一个横的,等把这个横的画完之后,My God,我们会发现一个惊人的事实,现在的这个结构是和我们最初放完一个横的一个竖的的那种情况的结构是一样的!因此,如果我们想继续向右拼出不能被竖线切分的矩形,那么只能是重复之前的操作,因而得到的最后横向边长为x的矩形是唯一确定的。

前面我们最初拼的时候只取了对称的两种情况之一,因此,如果x>2,拼出一个不能被竖线切割的矩形的方法只有两种。

那么递推公式自然就有了,f(n)=3*f(n-2)+2*f(n-4)+…+2*f(0),然后再写出f(n-2)的递推式后两式作差就可以得到f(n)=4*f(n-2)-f(n-4),递归的边界是f(0)=1,f(2)=4

 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int num[32];
 5     int i;
 6     num[0]=1;
 7     num[2]=3;
 8     for(i=4;i<32;i=i+2)
 9         num[i]=4*num[i-2]-num[i-4];
10     int n;
11     while(cin>>n){
12         if(n==-1)
13             break;
14         if(n%2==0)
15             cout<<num[n]<<endl;
16         else
17             cout<<"0"<<endl;
18     }
19     return 0;
20 }
时间: 2024-10-21 01:20:37

POJ 2663 Tri Tiling的相关文章

poj 2663 Tri Tiling 状压dp

题意: 给3*N(N<=30)的矩形,问有多少种用1*2的小矩形铺满的方案. 分析: 同poj2411. 代码: #include <iostream> using namespace std; __int64 ans[32][4]; int n,m; __int64 dp[2][1<<4]; __int64 solve() { int i,j,used; memset(dp,0,sizeof(dp)); __int64 *crt=dp[0],*nxt=dp[1]; crt[

POJ 2663 Tri Tiling dp 画图找规律

状态:d[i]代表n=i时的方案数. 状态转移方程:d[i]=d[i-2]+2*(d[i-2]+d[i-4]+…+d[0]) i只会为偶数,奇数情况不存在,d[0]=1 找状态转移方程的时候画图更好理解. #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int d[50]; int main() { int n; d[0]=1; d[2]=3; int sum

[POJ 3420] Quad Tiling

Quad Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3495   Accepted: 1539 Description Tired of the Tri Tiling game finally, Michael turns to a more challengeable game, Quad Tiling: In how many ways can you tile a 4 × N (1 ≤ N ≤ 1

POJ 3420 Quad Tiling 题解 《挑战程序设计竞赛》

POJ 3420 Quad Tiling贴瓷砖:4*N的地板上用2*1的瓷砖铺满,求所有方案数对M求余.3.4熟练掌握动态规划矩阵的幂久违地上了节课,太无聊,只好刷一题.假设S[n]表示填满n时的方案数,有S[0]=1.定义矩阵M[p][q] := 边缘p和边缘q可以拼合时取1,否则取0所谓的可以拼合表示,两个边缘拼起来后长度为1(为2就拼接不起来了),且内部缝隙可以用2*1的瓷砖填满.那么M就有一些简单的性质了,比如M的第一行应该是:0 0 0 0 0 0... 继续阅读:码农场 » POJ

Tri Tiling(hdu1143)

Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2731    Accepted Submission(s): 1547 Problem Description In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sa

I - Tri Tiling

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status 1 #include<cstdio> 2 using namespace std; 3 int f(int n) 4 { 5 if(n==0) 6 return 1; 7 if(n==2) 8 return 3; 9 else 10 return 4*f(n-2)-f(n-4); 11 } 12 int m

POJ 2506:Tiling

Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7452   Accepted: 3639 Description In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles? Here is a sample tiling of a 2x17 rectangle. Input Input is a sequence of lines,

Tri Tiling

Tri Tiling 三瓷砖 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2676    Accepted Submission(s): 1511 Problem Description In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is

HDU 1143 Tri Tiling (递推)

Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2118    Accepted Submission(s): 1211 Problem Description In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sa