1. 程式人生 > >每日一題(01.10)

每日一題(01.10)

Description:

現有一塊形如下圖的木板:
圖1
上面每一個凸出的三角都是直角邊長為A的等腰直角三角形,這些三角形形成了N個凹槽。現要往臺子上任意擺放邊長為A的正方形木塊,且使得木塊恰好卡到這些凹槽裡。擺放的木塊會形成的新的凹槽,這些新的凹槽上面又可以繼續擺放木塊,就像這樣:
圖2
請你程式設計求出,對於一塊有N個凹槽的木板,一共有多少種不同的擺放方式。
由於重力的存在,以下幾種情況是不可能出現的:
圖3
注意,空的臺子,也就是放置零塊木塊也算一種擺放方式。

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; }