luoguP2015 二叉蘋果樹 樹形dp

2021-09-28 18:00:07 字數 1721 閱讀 1876

題面

這題有樹 有dpdp

dp所以就是樹dpdp

dp咯

設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...