[OpenJudge] 2.3基本算法之递归变递推 PKU2506Tiling

14 篇文章 0 订阅

一、原题

9273:PKU2506Tiling
总时间限制: 2000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB
描述
对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。
下图是一个2行17列的走道的某种铺法。

输入
整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250
输出
如题
样例输入
2
8
12
100
200

样例输出
3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251

二、分析

这道题,看到样例输出最后两个数据,就说明要用高精度进行运算,所以我就增加了一个高精度计算,进行计算。从而达到目的,进行计算。其实这道题递推很简单,只是要加上一个高精度而已,以下是我的程序。

三、源程序

#include<iostream>
#include<cstdio>
using namespace std;
int a[301][501];
int max(int x,int y){return x>y?x:y;}
int main()
{
	a[1][0]=1;
	a[1][1]=1;
	a[2][0]=1;
	a[2][1]=3;
	for(int i=3;i<=300;i++){
		for(int j=1;j<=max(a[i-2][0],a[i-1][0]);j++)
			a[i][j]=a[i-1][j]+a[i-2][j]*2;
		a[i][0]=max(a[i-2][0],a[i-1][0]);
		for(int j=1;j<=a[i][0];j++){			//高精度
			a[i][j+1]+=a[i][j]/10;
			a[i][j]%=10;
		}
		while(a[i][a[i][0]+1]){
			a[i][0]++;
			a[i][a[i][0]+1]+=a[i][a[i][0]]/10;
		}
	}
	int n;
	while(cin>>n){
		if(n==0)
			cout<<1<<endl;
		else{
			for(int i=a[n][0];i>=1;i--)
				cout<<a[n][i];
			cout<<endl;
		}
	}
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值