洛谷 P2015 二叉蘋果樹(樹形DP)

2022-04-06 18:41:19 字數 841 閱讀 8973

樹上關於邊的0-1揹包問題。

因為這是一棵樹,所以當某條邊被保留下來時,從根節點到這條邊的路徑上的所有邊也都必須保留下來。

設dp[u][j]表示以u為根的子樹中,選取j條邊的最大值。

那麼轉移方程為:$dp[u][j]=max(dp[u][j],dp[u][j-1-k]+dp[v][k]+edge[i].val)$

u為當前節點,v是u的乙個子節點,sum[u]表示u的子樹上的邊數,m為最多保留邊數。

注意一些邊界:

如為何是dp[u][j-1-k]而不是dp[u][j-k]或者為何k的取值範圍要小於等於j-1而不是j:

因為這個子樹與u之間有一條邊,即u與v之間有一條邊,需要-1。

ac**:

1 #include2 #include3 #include4

using

namespace

std;

5const

int n=200;6

struct

nodeedge[n<<1];9

inthead[n],tot;

10int

sum[n],dp[n][n],n,m;

11void add(int u,int v,int

w)17

void dfs(int u,int

fa)27}28

}29}30

intmain()

38 dfs(1,-1

);39 printf("

%d\n

",dp[1

][m]);

40return0;

41 }

ac**

洛谷 P2015 二叉蘋果樹 樹形dp

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

洛谷P2015 二叉蘋果樹(樹形dp)

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

洛谷P2015 二叉蘋果樹 樹形dp)

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