1575 例 1 二叉蘋果樹

2021-10-01 01:45:11 字數 1087 閱讀 2614

有一棵二叉蘋果樹,如果數字有分叉,一定是分兩叉,即沒有只有乙個兒子的節點。這棵樹共 n 個節點,標號 1 至 n,樹根編號一定為 1。

我們用一根樹枝兩端連線的節點編號描述一根樹枝的位置。一棵有四根樹枝的蘋果樹,因為樹枝太多了,需要剪枝。但是一些樹枝上長有蘋果,給定需要保留的樹枝數量,求最多能留住多少蘋果。

第一行兩個數 n 和 q ,n 表示樹的節點數,q 表示要保留的樹枝數量。

接下來 n−1 行描述樹枝資訊,每行三個整數,前兩個是它連線的節點的編號,第三個數是這根樹枝上蘋果數量。

輸出僅一行,表示最多能留住的蘋果的數量。

5 2

1 3 1

1 4 10

2 3 20

3 5 20

21
設dp[u][i]為u節點上保留i根樹枝的至多保留的蘋果數,那麼轉態轉移方程便是dp[u][i]=max(dp[u][i],dp[u][i-k-1]+g[u][i].w+dp[v][k])

#include

#define read() freopen("input.txt","r",stdin);

#define write() freopen("output.txt","w",stdout);

using

namespace std;

const

int maxn =

1e3+10;

struct node

;vectorg[maxn]

;int n,m;

int dp[maxn]

[maxn]

,w[maxn]

;void

dfs(

int u,

int root)}}

}int

main()

);g[v]

.push_back

(node);

}dfs(1

,0);

printf

("%d"

,dp[1]

[m])

;return0;

}

1575 例 1 二叉蘋果樹 樹形DP

1575 例 1 二叉蘋果樹 問題描述 有一棵二叉蘋果樹,如果數字有分叉,一定是分兩叉,即沒有只有乙個兒子的節點。這棵樹共 n 個節點,標號 1 至 n,樹根編號一定為 1。我們用一根樹枝兩端連線的節點編號描述一根樹枝的位置。一棵有四根樹枝的蘋果樹,因為樹枝太多了,需要剪枝。但是一些樹枝上長有蘋果,...

二叉蘋果樹

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

二叉蘋果樹

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