poj2506

来源:互联网 发布:linux版本介绍 编辑:程序博客网 时间:2024/06/05 22:30

Tiling
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 9061 Accepted: 4318

Description

In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles? 
Here is a sample tiling of a 2x17 rectangle. 

Input

Input is a sequence of lines, each line containing an integer number 0 <= n <= 250.

Output

For each line of input, output one integer number in a separate line giving the number of possible tilings of a 2xn rectangle. 

Sample Input

2812100200

Sample Output

317127318451004001521529343311354702511071292029505993517027974728227441735014801995855195223534251

0的时候是1啊

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<math.h>struct numtype{    int len;    int a[1000];}dp[400];int n;/*void add(numtype a,numtype b,numtype c){    int i;    int len;    if(a.len>b.len)        len=a.len;    else        len=b.len;    for(i=1;i<=len;i++){        c.a[i]=a.a[i]+b.a[i];    }    for(i=1;i<=len;i++){        if(c.a[i]>9){            c.a[i]-=10;            c.a[i+1]++;        }    }    if(c.a[len+1]!=0) c.len=len+1;    else c.len=len;}*/int main(){    int i=3;    int j,len;    for(j=1;j<=1000;j++){                    dp[1].a[j]=0;    }    for(j=1;j<=1000;j++){                    dp[2].a[j]=0;    }    dp[0].len=0;    dp[0].a[1]=0;    dp[1].len=1;    dp[2].len=1;    dp[1].a[1]=1;    dp[2].a[1]=3;    while(~scanf("%d",&n)){            i=3;            while(i<=n){                dp[i].len=0;                len=dp[i-1].len;                for(j=1;j<=1000;j++){                    dp[i].a[j]=0;                }                for(j=1;j<=len;j++){                    dp[i].a[j]=dp[i-1].a[j]+dp[i-2].a[j]+dp[i-2].a[j];                }                for(j=1;j<=len;j++){                    while(dp[i].a[j]>=10){                        dp[i].a[j]-=10;                        dp[i].a[j+1]++;                    }                }                if(dp[i].a[len+1]!=0)                    dp[i].len=len+1;                else                    dp[i].len=len;                i++;            }        if(n!=0){            for(i=dp[n].len;i>0;i--){                printf("%d",dp[n].a[i]);            }        }        else            printf("1");        printf("\n");    }    return 0;}//A[1]=1,A[2]=3,A[n]=A[n-1]+2*A[n-2]



0 0
原创粉丝点击