codevs 5565 二叉蘋果樹 樹形DP

2022-05-18 22:13:43 字數 2087 閱讀 8093

時間限制: 1 s

空間限制: 128000 kb

題目等級 : ** gold

有一棵蘋果樹,如果樹枝有分叉,一定是分2叉(就是說沒有只有1個兒子的結點)這棵樹共有n個結點(葉子點或者樹枝分叉點),編號為1-n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋果。

給定需要保留的樹枝數量,求出最多能留住多少蘋果。

輸入描述 input description

第1行2個數,n和q(1<=q<= n,1輸出描述 output description

剩餘蘋果的最大數量。

樣例輸入 sample input

5 21 3 1

1 4 10

2 3 20

3 5 20

樣例輸出 sample output

資料範圍及提示 data size & hint

對於20%資料 n<=20;

對於100%資料1很簡單的一道樹形dp,思路是先把二叉樹各邊邊權值轉移到子節點上(這麼做才能確定各點的狀態),這樣點x的狀態即點x的子樹(包括點x)上保留y個點所得的最大值,開二維陣列儲存狀態即dp[x][y],然後一遍dfs確定dp[x][1]的值,即等於點x的權值,然後在回溯時進行狀態轉移,不難得出狀態轉移方程為:

dp[x][i]=max(dp[l[x]][j]+dp[r[x]][i-j-1]+dp[x][1],dp[x][i])。但要注意的問題是,最後還要對根節點進行一次狀態轉移:dp[1][q]=max(dp[l[1]][i]+dp[r[1]][q-i],dp[1][q]),因為點權之前是由邊權轉移而來,而根節點沒有參與邊權的轉移,故需要分開來。ac**:

1 #include2 #include

3#define maxn 233

4struct

node;

7node e[maxn];

8int

n,q,dp[maxn][maxn],pre[maxn],cnt,l[maxn],r[maxn];

9bool

vis[maxn];

10int

read();

11int max(int,int

);12

void dfs(int

);13

void build(int,int,int

);14

intmain()

23 dfs(1

);24

for(int i=0;i<=q;i++)

25 dp[1][q]=max(dp[l[1]][i]+dp[r[1]][q-i],dp[1

][q]);

26 printf("

%d",dp[1

][q]);

27return0;

28}29int

read()

32while('0'

<=c&&c<='

9')ans=ans*10+c-48,c=getchar();return ans*f;33}

34void build(int x,int y,int

z)38

void dfs(int

x)49

dfs(to);50}

51for(int i=2;i<=q;i++)

52for(int j=0;j)

53 dp[x][i]=max(dp[l[x]][j]+dp[r[x]][i-j-1]+dp[x][1

],dp[x][i]);54}

55}56int max(int x,int

y)

二叉蘋果樹

其實自己還有乙個思路,就是把狀態定為 x點的子樹中保留y條邊時的最大值,這樣就可以只有一條狀態轉移方程,但個人覺得處理起來沒有第一種思路好。

二叉蘋果樹

我們可以把保留邊轉換成保留點 因為我個人對保留點熟 跟據樹的性質,乙個點有0or1個根。所以我們可以把邊上的蘋果數轉移到子節點上。根據題意可知這應是一道dp題 廢話 設f i j 為以i為根的樹上保留j個節點的最大權值和,又因為這是個二叉樹,所以我們不妨設左子樹要保留的節點數為k,那麼右子樹的需要保...

二叉蘋果樹

有一棵二叉樹,每條樹枝上有乙個權值,求保留 q 個樹枝下能達到的最大權值。我們考慮 n 較小,先把邊轉化為點,我們可以用 f i j 表示以 i 為根的子樹中選 j 個節點的能達到的最大權值,那麼有三種情況 1 左子樹全部砍掉。2 右子樹全部砍掉。3 左子樹保留 k 個,右子樹保留 j k 個節點,...

題解 二叉蘋果樹

question 題目大意 邊權版本樹形 dp 求保留 q 條邊,使得其邊權和最大。當然,必須聯通。要不就不是 dp 了 那考慮設計 dp i j 表示第 i 個節點,選擇 j 條邊的最佳方案。寫出方程為 dp i j max dp i j k dp v k e i dis 列舉 k 表示邊數。這有...