題意:傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫「九頭龍」,但這只是說它出生的時候有九個頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。
有一天,有m個腦袋的九頭龍看到一棵長有n個果子的果樹,喜出望外,恨不得一口把它全部吃掉。可是必須照顧到每個頭,因此它需要把n個果子分成m組,每組至少有乙個果子,讓每個頭吃一組。
這m個腦袋中有乙個最大,稱為「大頭」,是眾頭之首,它要吃掉恰好k個果子,而且k個果子中理所當然地應該包括唯一的乙個最大的果子。果子由n-1根樹枝連線起來,由於果樹是乙個整體,因此可以從任意乙個果子出發沿著樹枝「走到」任何乙個其他的果子。
對於每段樹枝,如果它所連線的兩個果子需要由不同的頭來吃掉,那麼兩個頭會共同把樹枝弄斷而把果子分開;如果這兩個果子是由同乙個頭來吃掉,那麼這個頭會懶得把它弄斷而直接把果子連同樹枝一起吃掉。當然,吃樹枝並不是很舒服的,因此每段樹枝都有乙個吃下去的「難受值」,而九頭龍的難受值就是所有頭吃掉的樹枝的「難受值」之和。
九頭龍希望它的「難受值」盡量小,你能幫它算算嗎?
例如圖1所示的例子中,果樹包含8個果子,7段樹枝,各段樹枝的「難受值」標記在了樹枝的旁邊。九頭龍有兩個腦袋,大頭需要吃掉4個果子,其中必須包含最大的果子。即n=8,m=2,k=4:
可以發現如果有三個以上的頭那麼除最大的頭外不會有頭吃樹枝,那麼分情況處理兩個頭以及大於兩個頭dp即可。
#includeusing namespace std;
const int n=610;
int n,m,k,nxt[n],to[n],hd[n],w[n],tot,sz[310],dp[310][310][2],***[310][2];
void add(int u,int v,int c)
void dfs(int pos,int fa)}}
}}int main()
dfs(1,-1),printf("%d\n",min(dp[1][k][0],dp[1][k][1]));
}
貪吃的九頭龍
傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫 九頭龍 但這只是說它出生的時候有九個 頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。有一天,有 m 個腦袋的九頭龍看到一棵長有 n個果子的果樹,喜出望外,恨不得一口把它全部吃掉。可是必須照顧到每個頭,...
貪吃的九頭龍
時間限制 2 sec 記憶體限制 128 mb 提交 57 解決 22 提交 狀態 我的提交 傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫 九頭龍 但這只是說它出生的時候有九個頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。有一天,有m 個腦袋的九...
貪吃的九頭龍
題目描述 有一天,有m個腦袋的九頭龍看到一棵長有n個果子的果樹,想把果子一口全部吃掉。可是必須照顧到每個頭,因此它需要把n個果子分成m組,每組至少有乙個果子,讓每個頭吃一組。這m個腦袋中有乙個最大,稱為 大頭 是眾頭之首,它要吃掉恰好k個果子,而且k個果子中理所當然地應該包括唯一的乙個最大的果子。果...