有一棵蘋果樹,如果樹枝有分叉,一定是分2叉(就是說沒有只有1個兒子的結點)
這棵樹共有n個結點(葉子點或者樹枝分叉點),編號為1-n,樹根編號一定是1。
我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹
現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋果。2 5
\ /
3 4
\ /1
給定需要保留的樹枝數量,求出最多能留住多少蘋果。
第1行2個數,nn和q
(1<=q
<=n
,1<
n<
=200)q
(1<=q
<=n
,1<
n<=2
00)。
n表示樹的結點數,q表示要保留的樹枝數量。接下來n−1
n−1行描述樹枝的資訊。
每行3個整數,前兩個是它連線的結點的編號。第3個數是這根樹枝上蘋果的數量。
每根樹枝上的蘋果不超過30000個。
乙個數,最多能留住的蘋果的數量。
5 2
1 3 1
1 4 10
2 3 20
3 5 20
21
f[i
][j]
f[i]
[j] 表⽰以i節點為根,保留j個樹枝最多留下
多少個蘋果。
只給左⼉⼦:f[i
][j]
=f[l
son[
i]][
j−1]
+vls
on[i
]f[i
][j]
=f[l
son[
i]][
j−1]
+vls
on[i
]只給右⼉⼦:f[i
][j]
=f[r
son[
i]][
j−1]
+vrs
on[i
]f[i
][j]
=f[r
son[
i]][
j−1]
+vrs
on[i
]都分⼀點:f[i
][j]
=max
(f[l
son[
i]][
k]+f
[rso
n[i]
][j−
k−2]
+vls
on[i
],vr
son[
i]).
0<=k
<=j
−2f[
i][j
]=ma
x(f[
lson
[i]]
[k]+
f[rs
on[i
]][j
−k−2
]+vl
son[
i],v
rson
[i])
.0<=k
<=j
−2.另種思路在**中說明
#include#includeusing namespace std;
int n,q;
struct ben
a[205];
int f[205][205];
int cnt=1;
int head[205];//head[i]表示以i為起點的邊的編號
void add(int x,int y,int num)//連邊函式
void search(int dq,int father)
}} }
}int main()
//初始化
for(int i=1;isearch(1,0);
printf("%d",f[1][q]);
return 0;
}
洛谷 P2015 二叉蘋果樹
題目描述 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1 現在這顆樹枝條太多了,需要剪枝。但是一些...
洛谷P2015 二叉蘋果樹
有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1 現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有...
洛谷P2015 二叉蘋果樹
有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...