dp 奶牛家譜 Cow Pedigrees

2022-05-20 04:01:24 字數 1392 閱讀 9097

令人窒息的奶牛題

農民約翰準備購買一群新奶牛。 在這個新的奶牛群中, 每乙個母親奶牛都生兩個小奶牛。這些奶牛間的關係可以用二叉樹來表示。這些二叉樹總共有n個節點(3 <= n < 200)。這些二叉樹有如下性質:

每乙個節點的度是0或2。度是這個節點的孩子的數目。

樹的高度等於k(1 < k < 100)。高度是從根到最遠的那個葉子所需要經過的結點數; 葉子是指沒有孩子的節點。

有多少不同的家譜結構? 如果乙個家譜的樹結構不同於另乙個的, 那麼這兩個家譜就是不同的。輸出可能的家譜樹的個數除以9901的餘數。

輸入格式:

兩個空格分開的整數, n和k。

輸出格式:

乙個整數,表示可能的家譜樹的個數除以9901的餘數。

我們可以顯而易見地想到dfs做法。給每乙個點賦編號,再接著列舉有無孩子的狀態。然後如果再大力剪枝,就可以驚喜地發現到$n=60$之後就tle到飛起了。

這不是一道dp題嘛……考慮一下轉移,發現每一種樹要麼從同一層轉移過來、要麼從上一層轉移過來。那麼接著存一存每一種樹最下面一層的葉子節點數,再存一存每一種樹方案總數,接著就是這些資訊的轉移……搞來搞去我也搞不清這是什麼東西了。

設$f[i][j]$表示$i$個節點構造出深度為$j$的樹的方案數。顯而易見的是,轉移方程為

其中,即f[i][k]的字首和。

在轉移的時候,我們只需要列舉右孩子的節點數,再利用乘法原理乘上左孩子深度為$j-1$(除去根)的方案數。之後再將重複的情況減一下就可以了。

這看上去並沒有什麼問題對吧。

看到這裡大佬您有沒有發現這個dp出鍋了呢。

是!的!這個人畜無害的dp出鍋了!!!

並且截止撰寫這篇部落格的時候,依然沒有找出問題在**……

xyz表示dp方程並不用這麼複雜並且表示我的**畫風清奇非常鬼畜

好吧,似乎這份是有點又臭又長的感覺

我們以$f[i][j]$表示$i$個節點,$1..j$深度的方案數的字首和。那麼轉移起來就方便很多;並且得益於dp方程的定義,子樹節點個數是可以列舉過去的,不存在上面做法方案數乘2的事情,因此也不用管重複的問題了。

1 #include2

const

int mo = 9901;3

int f[203][203];4

intn,m;

5int

main()

6

這道題真的是挺(wo)有(tai)趣(cai)的(le),這些一步一步的寫法倒也是有很多值得深思的地方。

(似乎為了這題寫的程式數量可以立個記錄之類的?)

end

USACO TRAINING 奶牛家譜

時間限制 1 sec 記憶體限制 64 mb 提交 53 解決 24 提交 狀態 我的提交 農民約翰準備購買一群新奶牛。在這個新的奶牛群中,每乙個母親奶牛都生兩小奶牛。這些奶牛間的關係可以用二叉樹來表示。這些二叉樹總共有n個節點 3 n 200 這些二叉樹有如下性質 有多少不同的家譜結構?如果乙個家...

Luogu P1472奶牛家譜(DP)

題目鏈結 這是一道考思維的好題。一開始設f i j 是i個點剛好j層的方案數,死活調不出來,看題解發現可以改為 j層的方案數,最後輸出f n m f n m 1 就好了。對於計算考慮左右子樹分配,設i個點分給左子樹,j個點分配右子樹,注意列舉順序,乘法原理搞一搞就好。我拼盡全力只得了57分,qwq。...

P1472 奶牛家譜 Cow Pedigrees

太精妙,留著以後慢慢消化 法一 我們一層一層地來推,列舉層數,然後再列舉這一層選擇的奶牛的個數 必須是偶數個的,因為我第一層已經處理好了 然後再列舉上一層選擇的奶牛的個數 也必須是偶數的,因為我把第二層也特殊處理了,就可以從第三層開始了 但是發現一共要選擇n個奶牛,所以不得不再加一維目前總共選擇的奶...