1. 程式人生 > >[OpenJudge] 2.3基本演算法之遞迴變遞推 PKU2506Tiling

[OpenJudge] 2.3基本演算法之遞迴變遞推 PKU2506Tiling

一、原題

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