poj 2506 Tiling 递推

[color=blue][size=medium]
题目描述: [url]http://poj.org/problem?id=2506[/url]

题目大意: 使用2 * 1 和 2 * 2 的矩形铺砌2 * n 的矩形, 共有多少种方法?

分析:
假设f ( n ) 为铺砌 2 * n 的矩形的方法种数, 参见下图:
[img]http://dl.iteye.com/upload/attachment/481504/bd66df29-3f6f-37a6-b26a-1923be04dfee.png[/img]


易得 f ( n ) = f ( n - 1 ) + 2 * f ( n - 2 );
f ( 1 ) = 1; f ( 2 ) = 3;

又因为本体要求处理的n 很大, 需要大数处理, 故用Java 的BigInteger 类, 免去用c++ 实现大数加法, 代价是牺牲一部分的性能...


[/size][/color][color=red][size=medium]注意f ( 0 ) 的取值, 参见代码[/size][/color]

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
int n; //2 * n 的 n
BigInteger[] a = new BigInteger[251];
a[0] = BigInteger.ONE; //令人上火的是a[0] 为 1,??????
//刚开始写a[0] 为 0,WA
a[1] = BigInteger.ONE;
a[2] = new BigInteger("3");

for(int i = 3; i <= 250; i++) {
a[i] = a[i - 1].add(a[i - 2].add(a[i - 2]));
}
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
n = in.nextInt();
System.out.println(a[n]);
}
}

}

  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值