递推
/* 递推 我们要怎么得到n呢,可以考虑n-1的情况,在n-1的情况下我们只需要再放一个2*1的方块即可 接着可以考虑n-2的情况,我们可以放入一个2*2的方块即可,或者放入2个2*1的方块 接着我们可以考虑n-3的情况,可以放入3个2*1,或者1个2*2和1个2*1,或者1个2*1和1个2*2 然后会发现,这样子就重复,n-3的这些情况其实就是n-1和n-2加起来的情况 所以可以n只决定于n-1和n-2,易知递推公式为dp[n]=dp[n-1]+2*dp[n-2] */ #include <cstdio> #include <cstring> #define LEN 1010 #define MAX 250 #define max(a,b) a>b?a:b struct big { int a[LEN],len; }dp[MAX+10],tmp; void mul(int m) { int i,c=0; for(i=0; i<dp[m].len; i++) { tmp.a[i]=dp[m].a[i]*2+c; c=tmp.a[i]/10; tmp.a[i]%=10; } if(c) { tmp.a[i]=c; tmp.len=dp[m].len+1; } else tmp.len=dp[m].len; } void add(int m) { int len=max(dp[m-1].len , tmp.len) , c=0 , i; for(i=0; i<len; i++) { dp[m].a[i]=dp[m-1].a[i]+tmp.a[i]+c; c=dp[m].a[i]/10; dp[m].a[i]%=10; } if(c) { dp[m].a[i]=c; dp[m].len=len+1; } else dp[m].len=len; } void init() { dp[0].len=1; dp[0].a[0]=1; dp[1].len=1; dp[1].a[0]=1; dp[2].len=1; dp[2].a[0]=3; for(int i=3; i<=MAX; i++) { mul(i-2); //高精度乘法 add(i); //高精度加法 } } int main() { init(); int n; while(scanf("%d",&n)!=EOF) { for(int i=dp[n].len-1; i>=0; i--) printf("%d",dp[n].a[i]); printf("\n"); } return 0; }