hdu 2606 Renovation Problem hdu 2606

来源:互联网 发布:崇祯 知乎 编辑:程序博客网 时间:2024/05/17 23:06
//看了冰学长的思路才明白
// 当n>=3时可以全部由2x2的方砖镶嵌得到
//eg:
// 用 [**]   表示
//      [**]   一块2x2的方砖
// n=15 时
//[**][**][**][**][**][**][**] *
//[**][**][**][**][**][**][**] *
//* [**][**][**][**][**][**][**]
//* [**][**][**][**][**][**][**]
//  
//dp[i]可以由dp[i-1]+一列1x1方砖(1种)  或者dp[n-2]+由含2x2的方砖组成的两列(4种)  或者dp[n-3]+由含3x3的方砖组成的3列(2种) 或或者dp[n-4]+由含4x4的方砖组成的四列(1种)
//
//还可以由dp[n-3~0]+(3~n)列由2x2方砖镶嵌 得到
//
#include<stdio.h>
#include<string.h>


#define mod 19890907
int dp[110];
int main()
{
    int n,t;
    int i;
    int l;


    dp[0]=1;
    dp[1]=1;
    dp[2]=dp[1]+4*dp[0];
    dp[3]=dp[2]+4*dp[1]+2*dp[0]+2*dp[0];
    dp[4]=dp[3]+4*dp[2]+2*dp[1]+dp[0]+2*dp[1]+2*dp[0];




    for(i=5;i<=100;i++)
    {
        dp[i]=dp[i-1]+4*dp[i-2]+2*dp[i-3]+dp[i-4];
        dp[i]=dp[i]%mod;
        for(l=3;l<=i;l++)dp[i]=(dp[i]+2*dp[i-l])%mod;//计算末尾由2x2方砖镶嵌组成且长度为l由多少种情况


    }
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        printf("%d\n",dp[n]);
    }
    return 0;
}
0 0