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

  1. 2
  2. 8
  3. 12
  4. -1

Sample Output

  1. 3
  2. 153
  3. 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)=3

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

POJ 2663 Tri Tiling的更多相关文章

  1. POJ 2663 Tri Tiling 矩阵快速幂 难度:3

    Tri Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7841   Accepted: 4113 Descri ...

  2. POJ 2663 Tri Tiling 【状压DP】

    Description In how many ways can you tile a 3xn rectangle with 2x1 dominoes?  Here is a sample tilin ...

  3. poj 2663 Tri Tiling (状压dp+多米诺骨牌问题+滚动数组反思)

    本来直接一波状压dpAC的 #include<cstdio> #include<cstring> #include<algorithm> #define REP(i ...

  4. 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 找状态转移方程的时候画图更好理 ...

  5. [POJ 3420] Quad Tiling

      Quad Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3495   Accepted: 1539 Des ...

  6. Tri Tiling[HDU1143]

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. Tri Tiling(hdu1143)

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. uva 10918 - Tri Tiling(规律)

    题目链接:uva 10918 - Tri Tiling 题目大意:给出n,计算用1*2的瓷砖有多少种方法铺满3*n的地方. 解题思路:和uva 10359 - Tiling有点相似,不过难度会比较大, ...

  9. HDU 1143 Tri Tiling

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=1143 Tri Tiling Time Limit: 2000/1000 MS (Java/Others) ...

随机推荐

  1. Asp.net core 学习笔记 ( Web Api )

    asp.net core 把之前的 webapi 和 mvc 做了结合. mvc 既是 api. 但是后呢,又发现, api 确实有独到之处,所以又开了一些补助的方法. namespace Proje ...

  2. PhantomJS框架(初识无头浏览器)

    博主今天看到大神聊起 headless,首先我去了解了下这个概念  无头浏览器 selenium框架是有头浏览器的代表,即可看得见的浏览器 而headless browser无头浏览器,即看不见的浏览 ...

  3. how-to-view-source-of-chrome-extension

    https://gist.github.com/paulirish/78d6c1406c901be02c2d Option 1: Command-line download extension as ...

  4. python cook 整理

    1.字符串分割 单个分隔符    'abc'.split('b')  >> ['a','c'] 多个分隔符    re.split(r'[b,d]','abcde') >>&g ...

  5. English trip V1 - B 3. I'd Like a Room,Please 请给我一间房? Teacher:Julia Key:

    In this lesson you will learn to say what you need. 课上内容(Lesson) twin size bed  单人床 elevator     n. ...

  6. uva10564

    路径条数很好找.记录最小路径,就记录到各点的最小字符串,存储起来. #include <iostream> #include <cstdio> #include <cma ...

  7. apiCloud 选择图片,选择视频,压缩图片

    选择视频或图片,只需要一个 UIMediaScanner 模板就可以实现,点击链接查看api https://docs.apicloud.com/Client-API/UI-Layout/UIMedi ...

  8. 阻止ajax缓存方法

    通过添加meta标签 <meta http-equiv= "pragma" content= "no-cache"/> (pragma: 杂注) & ...

  9. php实现队列

    <?php //双向队列的实现 class DoubleEndedQueue{ public $elements; public function __construct(){//析构函数,创建 ...

  10. Known Notation ZOJ - 3829 (后缀表达式,贪心)

    大意:给定后缀表达式, 每次操作可以添加一个字符, 可以交换两个字符的位置, 相邻数字可以看做一个整体也可以分开看, 求合法所需最少操作数. 数字个数一定为星号个数+1, 添加星号一定不会更优. 先判 ...