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 2view codeusing
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 }
二叉蘋果樹 樹形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...