每日一题(01.10)

Description:

现有一块形如下图的木板:
每日一题(01.10)
上面每一个凸出的三角都是直角边长为A的等腰直角三角形,这些三角形形成了N个凹槽。现要往台子上任意摆放边长为A的正方形木块,且使得木块恰好卡到这些凹槽里。摆放的木块会形成的新的凹槽,这些新的凹槽上面又可以继续摆放木块,就像这样:
每日一题(01.10)
请你编程求出,对于一块有N个凹槽的木板,一共有多少种不同的摆放方式。
由于重力的存在,以下几种情况是不可能出现的:
每日一题(01.10)
注意,空的台子,也就是放置零块木块也算一种摆放方式。

Input:

多行输入,第一行输入一个正整数T(1<=T<=100),表示测试数据的组数。
接下来T组数据,每组包含一个正整数N(1<=N<=100),表示台子上凹槽的个数。

Output:

对于每组测试数据,输出一个整数,表示摆放方式的种数。
由于答案可能很大,请输出答案取模9973后的结果。

Sample Input:

2
1
2

Sample Output:

2
5

Reference Code:

#include<stdio.h>
#include<string.h>
const int MAXN=1005;
const int MOD=9973;
int dp[MAXN][MAXN];
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int N;
        scanf("%d",&N);
        memset(dp,0,sizeof(dp));
        dp[1][0]=dp[1][1]=1;
        for(int i=2;i<=N;i++){
            for(int j=0;j<=i;j++)
                if(j==0)
                    for(int k=0;k<=i-1;k++)
                        dp[i][j]=(dp[i][j]+dp[i-1][k])%MOD;
                else
                    for(int k=j-1;k<=i-1;k++)
                        dp[i][j]=(dp[i][j]+dp[i-1][k])%MOD;
        }
        int ans=0;
        for(int i=0;i<=N;i++)
            ans=(ans+dp[N][i])%MOD;
        printf("%d\n",ans);
    }
    return 0;
}