題面
這題有樹 有dpdp設dp[dp所以就是樹dpdp
dp咯
i][j
]dp[i][j]
dp[i][
j]表示在節點i
ii下面取j
jj個節點可以獲得的蘋果最大值
l s[
i]
ls[i]
ls[i
]表示i
ii的左兒子節點,,,r
s[i]
rs[i]
rs[i
]表示i
ii的右兒子節點
這兩個在dfs
dfsdf
s建樹的過程中就可以維護
我們用記憶化搜尋來實現dpdp
dps fd
(i,j
)sfd(i,j)
sfd(i,
j)的返回值表示在節點i
ii下面取j
jj個節點可以獲得的蘋果最大值
所以轉移方程如下:
k j=
,k=0
dp[i
][j]
=max
,k=j
dp[i
][j]
=max
;,
0<
k<
jk_j=\begin dp[i][j]=max\ ,k=0\\ dp[i][j]=max\ ,k=j\\ dp[i][j]=max\; ,0kj
=⎩⎪
⎨⎪⎧
dp[i
][j]
=max
,k=0
dp[i
][j]
=max
,k=j
dp[i
][j]
=max
;,0<
k
#include
using
namespace std;
inline
void
read
(int
&x)while
(ch>=
'0'&&ch<=
'9')
x=s*w;
}struct node
edge[
300]
;int n,m,x,y,z,cnt,head[
110]
,ls[
110]
,rs[
110]
,lv[
110]
,rv[
110]
,dp[
110]
[110];
inline
void
addedge
(int u,
int v,
int w)
inline
void
superadd
(int u,
int v,
int w)
void
dfs(
int u,
int fa)
}int
sfd(
int i,
int j)
return dp[i]
[j];
}int
main()
Luogu P2015 二叉蘋果樹
題目描述 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋果。給定...
luogu P2015 二叉蘋果樹
有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋果...
Luogu P2015 二叉蘋果樹
題目鏈結 樹上零一dp 記憶化搜尋 如果是空結點 如果是葉子結點直接返回蘋果數 以上都不滿足的話,dp狀態轉移 設定dp的轉移,轉移到左右兒子結點 for int i 1 i結果31分 1.說白了,記憶化搜尋還不是掌握的特別好 2.其次狀態設計不是特別好,在儲存左右兒子時,應該該需要儲存邊的 inc...