【递推+高精度】POJ2506-Tiling
思路别人那里讲的很清楚了,我就不阐述了。链接
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 const int MAXN=250+5; 7 int n; 8 struct Big 9 { 10 int num[MAXN],len; 11 }; 12 Big ans[MAXN]; 13 14 void dou(Big &x) 15 { 16 for (int i=0;i<x.len;i++) 17 { 18 x.num[i]=x.num[i]*2; 19 if (i>0) 20 { 21 x.num[i]+=x.num[i-1]/10; 22 x.num[i-1]=x.num[i-1]%10; 23 } 24 } 25 if (x.num[x.len-1]>9) 26 { 27 x.num[x.len]=x.num[x.len-1]/10; 28 x.num[x.len-1]=x.num[x.len-1]%10; 29 x.len++; 30 } 31 } 32 33 void plu(Big x,Big y,Big &z) 34 { 35 memset(z.num,0,sizeof(z.num)); 36 int length=max(x.len,y.len); 37 for (int i=0;i<length;i++) 38 { 39 z.num[i]=z.num[i]+x.num[i]+y.num[i]; 40 z.num[i+1]=z.num[i]/10; 41 z.num[i]=z.num[i]%10; 42 } 43 if (z.num[length]!=0) z.len=length+1; 44 else z.len=length; 45 } 46 47 int main() 48 { 49 while (scanf("%d",&n)!=EOF) 50 { 51 ans[0].num[0]=1;ans[0].len=1; 52 ans[1].num[0]=1;ans[1].len=1; 53 for (int i=2;i<=n;i++) 54 { 55 dou(ans[i-2]); 56 plu(ans[i-2],ans[i-1],ans[i]); 57 } 58 for (int i=ans[n].len-1;i>=0;i--) cout<<ans[n].num[i];cout<<endl; 59 } 60 return 0; 61 }