貪吃的九頭龍

2021-07-14 13:06:21 字數 2826 閱讀 3923

傳說中的九頭龍是一種特別貪吃的動物。

雖然名字叫「九頭龍」,但這只是說它出生的時候有九個

頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。

有一天,有

m 個腦袋的九頭龍看到一棵長有

n個果子的果樹,喜出望外,恨不得一口把它全部吃掉。

可是必須照顧到每個頭,因此它需要把

n 個果子分成

m組,每組至少有乙個果子,讓每個頭吃一組。 這 m

個腦袋中有乙個最大,稱為「大頭」,是眾頭之首,它要吃掉恰好

k個果子,而且

k 個果子中理所當然地應該包括唯一的乙個最大的果子。

果子由 n−

1根樹枝連線起來,由於果樹是乙個整體,因此可以從任意乙個果子出發沿著樹枝「走到」任何乙個其他的果子。

對於每段樹枝,如果它所連線的兩個果子需要由不同的頭來吃掉,那麼兩個頭會共同把樹枝弄斷而把果子分開;如果這兩個果子是由同乙個頭來吃掉,那麼這個頭會懶得把它弄斷而直接把果子連同樹枝一起吃掉。

當然,吃樹枝並不是很舒服的,因此每段樹枝都有乙個吃下去的「難受值」,而九頭龍的難受值就是所有頭吃掉的樹枝的「難受值」之和。

九頭龍希望它的「難受值」盡量小,你能幫它算算嗎?

例如 圖1 所示的例子中,果樹包含

8 個果子,

7段樹枝,各段樹枝的「難受值」標記在了樹枝的旁邊。九頭龍有兩個腦袋,大頭需要吃掉

4 個果子,其中必須包含最大的果子。 即 n

圖一描述了果樹的形態,圖二描述了最優策略。第 1

行包含三個整數 n,

m ,k。

n 個果子依次編號 1~

n ,且最大的果子的編號總是 1。

第 2行到第

n行描述了果樹的形態,每行包含三個整數

a ,b,

c ,表示存在一段難受值為

c的樹枝連線果子

a 和果子b。

一行,包含乙個整數,表示在滿足「大頭」的要求的前提下,九頭龍的難受值的最小值。

如果無法滿足要求,輸出 -1 。

8 2 4

1 2 20

1 3 4

1 4 13

2 5 10

2 6 12

3 7 15

3 8 5

1≤

n≤300 ; 2≤

m≤n ; 1≤

k≤n ; 0≤

c≤105

首先,判斷無解的條件:n−

k1 。

狀態表示: 用 f

[i][

j][k

] 表示當前在節點

i ,而大頭還需要吃

j個果子,

k 表示當前節點的父節點是否被大頭吃。

狀態轉移方程就很簡單了。

#include
#include

#include

#define max(x,y) ((x)>(y)?(x):(y))

#define min(x,y) ((x)

using

namespace

std;

int n,m,k,cnt,cnts,f[900][900][4],fa[900];

int nxt[900],data[900],flow[900],head[900];

int nxts[900],datas[900],flows[900],heads[900];

int child[900][900],ans;

void add(int x,int y,int z)

void add1(int x,int y,int z)

void dfs(int now,int pre)

else

dfs(datas[i],now);

}}int dp(int now,int need,bool turn)

for(int j=head[now];j!=-1;j=nxt[j])if(child[fa[now]][data[j]]!=-1)

if(need==0)

else

if(p!=-1&&br==-1)

else

if(p!=-1&&br!=-1)

else

return f[now][need][turn]=min(0x3f3f3f3f,tmp2);

return f[now][need][turn]=min(0x3f3f3f3f,tmp2);

}if(p==-1&&br!=-1)

else

if(p!=-1&&br==-1)

else

if(p!=-1&&br!=-1)

else

return f[now][need][turn]=min(0x3f3f3f3f,min(tmp2,tmp1));

}int main()

for(int i=1,x,y,z;iscanf("%d%d%d",&x,&y,&z);

add1(x,y,z);

}dfs(1,0);

for(int i=head[1];i!=-1;i=nxt[i])if(child[1][data[i]]!=-1)

printf("%d\n",ans);

return

0;}

貪吃的九頭龍

時間限制 2 sec 記憶體限制 128 mb 提交 57 解決 22 提交 狀態 我的提交 傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫 九頭龍 但這只是說它出生的時候有九個頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。有一天,有m 個腦袋的九...

貪吃的九頭龍

題目描述 有一天,有m個腦袋的九頭龍看到一棵長有n個果子的果樹,想把果子一口全部吃掉。可是必須照顧到每個頭,因此它需要把n個果子分成m組,每組至少有乙個果子,讓每個頭吃一組。這m個腦袋中有乙個最大,稱為 大頭 是眾頭之首,它要吃掉恰好k個果子,而且k個果子中理所當然地應該包括唯一的乙個最大的果子。果...

樹形DP 貪吃的九頭龍

題意 思路首先,判斷是否有解是十分簡單的。我們只需要看在給每個小頭分配1個,大頭分配k個的情況下,所需要的果子的數量是否大於了蘋果的總數。也就是m k是否 n。接下來就是有解的情況了。首先我們需要知道,再分配好大頭之後,剩下的果子必然存在一種分配方式,使得九頭龍的難受值不會再增加。我們可以先考慮一堆...