【USACO TRAINING】奶牛家譜

問題 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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章