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 }
耐得住寂寞才能守住繁华,该奋斗的年龄不要选择了安逸

浙公网安备 33010602011771号