poj2506Tiling(dp)

2 篇文章 0 订阅

题目链接

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.

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);
		}
			
	}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值