uva 10359 Tiling

递推

/*

递推

我们要怎么得到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;

}

 

你可能感兴趣的:(uva)