二叉蘋果樹 樹形dp

2022-10-09 12:54:07 字數 938 閱讀 8619

p2015 二叉蘋果樹 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

嗚嗚嗚嗚,真的是一道厲害題(至少對目前的我來說),研究了乙個小時。

首先,因為我們不知道一對座標中,誰是父親,誰是兒子,所以用無向圖把二者連起來,但最後dfs的時候還是只用其中乙個。

狀態表示:i的子樹上保留j條邊時蘋果的最大值   q是最大邊數,n是結點數

狀態計算:f [ i , j ] = max ( f [ 左 , k ] + val [ i , 左 ] + f [ i , q-k-1 ] )

其中,左代表i的左兒子。f [ 左 , k ] 代表i的左兒子的子樹上保留k條邊時蘋果的最大值, val [ i , 左 ] 表示從i到左兒子的邊上結出來的蘋果數量,f [ i , q-k-1 ]表示i的右兒子的蘋果最大值。

k的範圍是0到q-1,那麼右節點的邊數就是q-k-1啦

為什麼k最大是q-1,而不是q呢?因為i到左結點或者右節點還要連一條邊呀,所以總邊數-1。

注意for迴圈要倒著來

1 #include 2

using

namespace

std;

3const

int n=352;4

intg[n][n],f[n][n];

5bool

st[n];

6 vectorson[n];

7int

n,q;89

void dfs(int

u)1023}

24}2526

intmain()

2736

37 dfs(1

);38 printf("

%d\n

",f[1

][q]);

3940

return0;

41 }

view code

二叉蘋果樹 樹形DP

題意 description 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1 現在這顆樹枝條太多了...

樹形DP 二叉蘋果樹

有一棵二叉蘋果樹,如果樹枝有分叉,一定是分兩叉,即沒有只有乙個兒子的節點。這棵樹共 n 個節點,編號為 1 至 n,樹根編號一定為 1。我們用一根樹枝兩端連線的節點編號描述一根樹枝的位置。一棵蘋果樹的樹枝太多了,需要剪枝。但是一些樹枝上長有蘋果,給定需要保留的樹枝數量,求最多能留住多少蘋果。這裡的保...

二叉蘋果樹(樹形DP)

原題 顯然我們考慮這道題目可以很蠢的寫乙個dp對吧。考慮 dp i,j 表示以i為根,保留j個節點的最大蘋果數。然後就可以樹形dp的寫了。include include include include include include include define ll long long defin...