洛谷 2015 二叉蘋果樹

2022-07-25 14:57:14 字數 1275 閱讀 8616

題意就是給你n-1條樹枝,每條樹枝上都帶有一定的蘋果,問最後留下m根樹枝,能擁有的蘋果的最大值,根節點為1,每個節點只有2種情況,有2個兒子,或沒有兒子。

這題是乙個很典型的樹形結構,因為節點以邊相連,又為二叉結構,無環。我們這時候從根節點下順,找到最深的兒子,然後一步步開始回溯,以當前回溯到的這個點作為根,考慮他

有幾條邊的最大值。那從下至上遞推回去,根節點的狀態只與2個子節點有關,很明顯,這就是乙個dp,且是樹形的。

本題的狀態轉移方程要先列出:dp[i][j]=max(0<=j<=m,0<=k

以樣例為例,我們這時候從根節點1向下搜尋,找到了2,可是2這時候作為單點,並不存在邊,便回溯,到3,這時候3-2有一條邊,我們可以考慮是否要添這條邊,dp[3][1]這時候要由dp[2][0]

轉移而來,為什麼呢,因為這時候3如果要與2相連,是肯定要加3-2這條邊,不然子樹與根就無法連線起來了吧。接下來查到5這個點回溯,可以處理dp[3][2]了,dp[3][2]只由dp[5][0]和dp[5][1]而來,

因為3-2處理過了對吧,由dp[5][1]而來的時候,為什麼加的是dp[3][0]呢?(請注意觀察式子,可以用筆推導),因為前面有提到過,若要根與子樹相連,必須選取根與子樹的根的邊。所以整個式子

就很好理解,你當前的這個點的兒子取j條邊,你的根就只能取m-j-1條邊。

**實現如下:

#include#include

#include

using

namespace

std;

int dp[105][105

];vector

son[105

];int val[105][105

];int vis[105

];int

n,m;

void dfs(int

x) vis[y]=1;///

誰先到誰是爹

dfs(y);

for(int j=m;j>=1;j--)}}

}int

main()

dfs(

1);///

從根節點開始

cout<1][m]//

回溯至最開始的根節點,m條邊的最大值

}

洛谷 2015 二叉蘋果樹

luogu sol 首先需要根據題目條件把蘋果樹建出來 容易想到f i j 表示以i結點為根的蘋果樹上保留j個結點所能保留的最大蘋果樹 需要注意的是f i j 包括i結點 根 與它的父親聯結的枝條上的蘋果 轉移的話就列舉i的第乙個子結點保留的結點數k,那麼另乙個子結點保留的就是j k 1 這題的轉移...

洛谷 P2015 二叉蘋果樹

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

洛谷P2015 二叉蘋果樹

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