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