1. 程式人生 > >HDU1143——Tri Tiling(DP)

HDU1143——Tri Tiling(DP)

思路:把大矩形用豎線切出左邊一部分,然後遞迴求解,豎線是沿著紋路分的,右面就是f(n-2)有三種情況,即3*f(n-2)。左面是f(n-4),只有兩種情況(注意左面再分是,是不可以出現一條豎線可以切分的情況,所以只有兩種情況)。

遞推公式出現:f(n)=3*f(n-2)+2*f(n-4)+…+2*f(0)

                         f(n-2)=3*f(n-4)+2*f(n-6)+...+2*f(0),f(n)-f(n-2)得出f(n)公式

                         f(n)=4*f(n-2)-f(n-4)

#include <iostream>
#include <stdio.h>
using namespace std;
/*long long fun(int n)  //用遞迴會出現Memory Limit Exceeded錯誤
                        //超出記憶體限制
{
    if(n==0)
        return 1;
    if(n==2)
        return 3;

    else
        return 4*fun(n-2)-fun(n-4);
}*/
int main()
{
    int n;
    int a[100];
    while(~scanf("%d",&n))
    {

        if(n==-1)
            break;
        a[0]=1;
        a[2]=3;
        for(int i=3;i<=n;i++)
            a[i] = 4*a[i-2]-a[i-4];
        if(n%2!=0)
            printf("0\n");
        else
            printf("%d\n",a[n]);
    }
    return 0;
}