Tri Tiling

1、题意说明
  用2*1的小矩形 填充大小为3*n的大矩形,问填充方案有多少种(HDU 1143
2、解题思路
  (1)标记和概念说明
    f(n):其中的n即为题目中矩形的长,高固定位3,也即为题目中说的3xn中的n,f(n)表示当长为n时,所有的摆放方式的数量。
    分割线:一条竖直的线,这条线穿过题目中的矩形,将矩形一分为二,且这条线不能从砖的中间穿过,也就是说只有砖的边缘对齐的时候,才能穿过。
 (2)解题思想
    2.1 对于每一种砖的摆放情况,可能有多条上面说的分割线,但是对于每一种情况,我们只需要所有分割线中最右边的一条,我们记为L。也就是说在L的右边的部分就是不可分割的了,但是左边可能还是可以分割的。对于L的左边我们继续使用函数f即可,而右边是需要我们研究的主要部分,因为右边不能应用函数f。
    2.2 不能应用函数f的原因是因为右边不在可分割。对于长度为2的不可分割矩形的摆放方式有三种方式,对长度大于2的不可分割矩形的摆放方式有两种方式。上一句话的理解也许需要你拿起笔在纸上画一画。
    2.3 同时,考虑这样的L可能在哪些位置?可能在从右边数起的长度为2的位置,也有可能在长度为4的位置,……,也有可能在长度为n的位置。当然,也只可能在上述的位置中,因此有如下结果:
            f(n)=f(n-2)*3+f(n-4)*2+...+f(2)*2+f(0)*2  ----  表达式1
        然后,将上式用n-2替换得:
            f(n-2)=f(n-4)*3+f(n-6)*2+...+f(2)*2+f(0)*2  ----  表达式2
        表达式1减去表达式2得:
            f(n)=4*f(n-2)-f(n-4)
    2.4 在利用上面的递推公式时,我们需要两个递推的出口,即f(0) = 1, f(2) = 3.由上面的递推公式也知道不涉及当n为奇数的情况,当n为奇数时,直接为零。因为当n为奇数时,矩形的面积为奇数,但是不管我们使用了多少块砖,砖的总面积一定是个偶数,所以不存在任何的摆放形式。
3、解题代码
  
 1 package OJ_20160125;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Tiling
 6 {
 7 
 8     public static void main(String[] args)
 9     {
10         // TODO Auto-generated method stub
11         Scanner in=new Scanner(System.in);
12         int nums[]=new int[31];
13         nums[0]=1;
14         nums[2]=3;
15         for(int i=1;i<30;i+=2)
16             nums[i]=0;
17         for(int i=4;i<=30;i+=2)
18         {
19             nums[i]=nums[i-2]*4-nums[i-4];
20         }
21         int n=in.nextInt();
22         while(n!=-1)
23         {
24             System.out.println(nums[n]);
25             n=in.nextInt();
26         }
27     }
28 
29 }
View Code

 

 
posted @ 2016-01-26 14:00  Westly  阅读(398)  评论(0)    收藏  举报