有一棵蘋果樹,如果樹枝有分叉,一定是分2叉(就是說沒有只有1個兒子的結點)
這棵樹共有n個結點(葉子點或者樹枝分叉點),編號為1-n,樹根編號一定是1。
我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹
現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋果。2
5 \ /34
\ /1
給定需要保留的樹枝數量,求出最多能留住多少蘋果。
第1行2個數,n和q(1<=q<= n,1乙個數,最多能留住的蘋果的數量。
#輸出 #1## 輸入 #1
521
3114
102320
3520
21
很明顯,這是一道dp,我們用f[now][i]表示以第now(我們使用dfs進行dp)個點為根的子樹選擇i個點(我們事先把邊轉換成點)的最大值,動態轉移方程為:
f [n
ow][
k]=m
ax(f
[now
][k]
,f[t
ree[
now]
[1]]
[i]+
f[tr
ee[n
ow][
2]][
k−i−
1]+n
um[n
ow])
;f[now][k]=max(f[now][k],f[tree[now][1]][i]+f[tree[now][2]][k-i-1]+num[now]);
f[now]
[k]=
max(
f[no
w][k
],f[
tree
[now
][1]
][i]
+f[t
ree[
now]
[2]]
[k−i
−1]+
num[
now]
);我們外面套一層dfs,那麼時間複雜度為o(n2)。**如下:
#include
#include
using
namespace std;
int n,q,a[
110]
[110];
int tree[
110][3
],num[
110]
,f[110][
110]
;void
build
(int now)
}void
dfs(
int now,
int k)}}
intmain()
build(1
);dfs(
1,q+1)
; cout<[q+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 現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有...
洛谷P2015 二叉蘋果樹
有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...