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

2021-08-20 02:51:02 字數 1249 閱讀 7135

給出乙個n個點的二叉樹,樹上有邊權,求留下q個樹枝能夠獲得的最大收益為多少。dp

[i][

j]d p[

i][j

]表示在以

i i

為根的節點,留下

j' role="presentation">j

j個分支,的最大收益值。設u

u

為當前遍歷到的根節點,

v' role="presentation">v

v為訪問的子節點,e[

i].w

e [i

].

w當前邊的邊權。則狀態轉移方程如下: dp

[u][

j]=m

ax(d

p[u]

[j],

dp[u

][j−

k]+d

p[v]

[k−1

]+e[

i].w

) dp[

u][j

]=ma

x(dp

[u][

j],d

p[u]

[j−k

]+dp

[v][

k−1]

+e[i

].w)

還要注意迴圈順序,迴圈j要從m到0,而k是任意的,這與轉移的順序有關係

#include "bits/stdc++.h"

using

namespace

std;

const

int nmax = 1e6 + 10;

const

int inf = 0x3f3f3f3f;

typedef

long

long ll;

typedef

double db;

typedef

struct edge;

edge e[nmax << 1];

int dp[1010][1010];

int head[nmax], tot, n, m;

void init()

void add(int u, int v, int w)

void getdp(int u , int fa)

}int main()

getdp(1, -1);

printf("%d\n", dp[1][m]);

return

0;}

洛谷 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現在這顆樹枝條太多了,需要剪枝。但是一些樹枝...