問題 N(1050): 【USACO TRAINING】奶牛家譜
時間限制: 1 Sec 內存限制: 64 MB提交: 53 解決: 24
[提交][狀態][我的提交]
題目描述
農民約翰準備購買一羣新奶牛。 在這個新的奶牛羣中, 每一個母親奶牛都生兩小奶牛。這些奶牛間的關係可以用二叉樹來表示。這些二叉樹總共有N個節點(3 <= N < 200)。這些二叉樹有如下性質:
- 每一個節點的度是0或2。度是這個節點的孩子的數目。
- 樹的高度等於K(1 < K < 100)。高度是從根到任何葉子的最長的路徑上的節點的數目; 葉子是指沒有孩子的節點。
有多少不同的家譜結構? 如果一個家譜的樹結構不同於另一個的, 那麼這兩個家譜就是不同的。
輸出可能的家譜樹的個數除以9901的餘數。
輸入
第1行:2個空格分開的整數, N和K。
輸出
第1行:1個整數,表示可能的家譜樹的個數除以9901的餘數。
樣例輸入
(如果複製到控制檯無換行,可以先粘貼到文本編輯器,再複製)
5 3
樣例輸出
2
提示
說明:
有5個節點,高爲3的兩個不同的家譜:
分析:開始還想暴力搜索,後來越寫越不對。。。。。233333333,,,然後後來發現是dp,qnq但當時思維莫名固化在遞歸上,,,233333就寫成計劃搜索了qwq。。。。。dp思路還是挺好想的,dp[k][n]表示到k層爲止用了n個節點(第k層可能沒有節點),然後枚舉上一層爲止用了的節點個數更新233333,,,,
dp[k][n]+=dp[k-1][lst]*dp[k-1][n-lst-1];
qnq:然而AC後看前面跑得快的程序,直接一個三層循環,還比我短一半(壓行強迫症患者的重點),,23333333,,qnq,,莫名小絕望,,我的計劃搜索已經醜到這種境界了嗎233333333333,,,qnq
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int MOD=9901;
int n,K,dp[210][210];
int dfs(int k,int n){
if(dp[k][n]>=0) return dp[k][n]%=MOD;
if(n==1) return dp[k][n]=1;
if(k==1) return dp[k][n]=0;
if(k<1||n<1) return dp[k][n]=0;
int ans=0;
for(int i=1;i<=n-2;i++)
ans=(ans+dfs(k-1,i)*dfs(k-1,n-i-1))%MOD;
return dp[k][n]=ans;
}
int main(){
scanf("%d %d",&n,&K);
memset(dp,-1,sizeof(dp));
int a,b=dfs(K-1,n);
a=dfs(K,n);
printf("%d\n",(a-b+MOD)%MOD);
}