Loj10153 二叉蘋果樹

2022-05-19 02:23:38 字數 1164 閱讀 7743

題目描述

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

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

輸入格式

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

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

輸出格式

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

一眼,是樹形dp,其中dp[i][j]代表以i為根節點的子樹中,保留j個節點能取到的最大數量。

對於每乙個節點,列舉左子樹的保留節點數,則右子樹保留節點數就是總結點數減去左子樹。

根據這個進行記憶化搜尋。

#include #include 

#include

#include

#include

#define in(a) a=read()

#define rep(i,k,n) for(int i=k;i<=n;i++)

using

namespace

std;

inline

intread()

intn,m;

int l[1010],r[1010],s[1010

];int f[110][110

];inline

int dfs(int i,int

j)int total,head[1010],to[1010],nxt[1010],val[1010

];inline

void adl(int a,int b,int

c)inline

void

get(int u,int

fa)

return;}

intmain()

二叉蘋果樹

我們可以把保留邊轉換成保留點 因為我個人對保留點熟 跟據樹的性質,乙個點有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 表示邊數。這有...