1. 程式人生 > 其它 >洛谷P4362題解

洛谷P4362題解

題面

樹形DP。
首先可以發現, \(m>2\) 時,難受度只出現在最大的頭吃的果子上(因為我把果子分成最大的頭吃的和其他的,其他的裡面,相鄰的果子讓不同的頭吃即可)。
然後我定義 \(f_{i,j,k}\) 為當前為 \(i\) 節點,當前節點分 \(j\) 個果子給最大的頭,當前節點選擇情況為 \(k\)\(1\)\(0\) 不選)。
那麼對於每一個子節點,我們有

\[f_{u,j,0}=\operatorname{min}\{ \operatorname{min}\{ f_{v,t,0}+f_{u,j-t,0}+[m=2]w_i,f_{v,t,1}+f_{u,j-t,0} \} \},\\ f_{u,j,1}=\operatorname{min}\{ \operatorname{min}\{ f_{v,t,1}+f_{u,j-t,1}+w_i,f_{v,t,0}+f_{u,j-t,1} \} \}, \]

解釋:
當我當前節點不給最大頭,那麼 f{u,j-t} 的第三項只能取 \(0\)

,同理,如果我當前節點不給最大頭吃,那麼 f{u,j-t} 的第三項只能取 \(1\)
如果 \(m=2\) ,那麼當我當前節點和當前節點的子節點全部取 \(0\) 時,就是說這兩個點都給第二個頭吃,那麼答案要加上 \(w_i\) ,否則不用(前面說過了)。
然後如果我當前節點和子節點全部給大頭,那麼這中間這段樹枝必須加到答案裡。

但是,這樣做會導致更新過的 \(f\) 再去更新別的 \(f\) ,所以我們要把用來更新的 \(f\) 拍到另一個數組 \(g\) 中,則:

\[f_{u,j,0}=\operatorname{min}\{ \operatorname{min}\{ f_{v,t,0}+g_{j-t,0}+[m=2]w_i,f_{v,t,1}+g_{j-t,0} \} \},\\ f_{u,j,1}=\operatorname{min}\{ \operatorname{min}\{ f_{v,t,1}+g_{j-t,1}+w_i,f_{v,t,0}+g_{j-t,1} \} \}, \]

這樣方程就寫完了。
另外,如果果子個數不夠,那麼答案就是 \(-1\)


最終輸出的答案就是 \(f_{1,k,1}\) ,因為規定第一個點必須選。

程式碼