洛谷 P2015 二叉蘋果樹

2021-10-09 04:12:22 字數 1508 閱讀 3357

有一棵蘋果樹,如果樹枝有分叉,一定是分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現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...