Tiling
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9469 | Accepted: 4500 |
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.
Here is a sample tiling of a 2x17 rectangle.
Input
Input is a sequence of lines, each line containing an integer number 0 <= n <= 250.
Output
For each line of input, output one integer number in a separate line giving the number of possible tilings of a 2xn rectangle.
Sample Input
2 8 12 100 200
Sample Output
3 171 2731 845100400152152934331135470251 1071292029505993517027974728227441735014801995855195223534251解题思路:dp加高精度;题目比较简单,就是问你用2*1和2*2的方块能有几种方法组合成2*n的方块递归 公式很容易得到,f(1)=1,f(2)=3,当求f(3)时,我们可以观察到f(3)可以用f(1)和f(2)来拼凑。我们可以假设当n=3时, 组合方式(1):可以有一个2*2(即f(2)它的值为3)和一个2*1(f(1)值为1)的方式组合,共有f(n-1)*1种。 组合方式(2):就是2*1和2*2组合,2*1的组合方式只有一种,2*2的方式有三种,但是下面这种方式会和组合方式(1)重复 所以是f(n-1)*2种方式。当推广到n时方法f(n)=f(n-1)+2*f(n-2);然后高精度提供两种方法,第一种就是用一个二维数组把数存起来 ,当数大于十时,就后面进一。第二种就是使用java里的BigInteger,这个用起来比较简单,推荐会java的同学就使用java。
import java.math.*;
import java.util.Scanner;
public class Tiling {
private static Scanner input;
public static void main(String[] args){
input = new Scanner(System.in);
BigInteger a=new BigInteger("1");
BigInteger b=new BigInteger("3");
BigInteger c=new BigInteger("0");
while(input.hasNext()){
int n=input.nextInt();
if(n==0){
System.out.println(a);
}
if(n==1){
System.out.println(a);
}
else if(n==2){
System.out.println(b);
}
else{
for(int i=3;i<=n;i++){
c=b.add(a.multiply(new BigInteger("2")));
a=b;
b=c;
}
System.out.println(c);
}
}
}
}