Luogu P2015 二叉蘋果樹

2022-05-20 13:43:47 字數 2605 閱讀 7581

題目鏈結

樹上零一dp

記憶化搜尋

如果是空結點

如果是葉子結點直接返回蘋果數

以上都不滿足的話,dp狀態轉移

設定dp的轉移,轉移到左右兒子結點

for(int i=1;i結果31分  

1.說白了,記憶化搜尋還不是掌握的特別好

2.其次狀態設計不是特別好,在儲存左右兒子時,應該該需要儲存邊的

#include#include

#define ll long long

#define fora(i,s,e) for(ll i=s;i<=e;i++)

#define fors(i,s,e) for(ll i=s;i>=e;i--)

using

namespace

std;

const ll n=1000

;ll n,m,num_edge,sz[n+1],head[n+1],f[n+1][n+1

];/*

f[u][j]表示的是樹根為u的子樹中保留j條樹枝的最多的蘋果數

sz[u]表示的是樹根為u的子樹的大小

*/struct

edgeedge[

2*n+2

];struct

messp[n+1

];inline

void add_edge(ll from

,ll to,ll dis)

,head[from]=num_edge;

}inline ll max(ll fa,ll fb)

inline ll min(ll fa,ll fb)

void

dfs(ll u,ll fa)

}}int

main()

dfs(

1,0);

printf(

"%lld

",f[1

][m]);

return0;

}/*5 21 3 1

1 4 10

2 3 20

3 5 20

*/

記憶化搜尋,樹型揹包dp

這道題有乙個隱含的條件,當某條邊被保留下來時,從根節點到這條邊的路徑上的所有邊也都必須保留下來

設f[u][i]表示uu的子樹上保留ii條邊,至多保留的蘋果數目

那麼狀態轉移方程也就顯而易見了

fors(j,min(sz[u],m),0)//零一揹包,對於每一種選擇只能選一次

fora(k,0,min(sz[v],j-1))

f[u][j]=max(f[u][j],f[v][k]+f[u][j-k-1]+edge[i].dis);

u表示當前節點,v是u的乙個子節點,sz[u]表示uu的子樹上的邊數,m就是題目中要求的最多保留邊數

那麼為什麼是

首先,為什麼是f[u][i-j-1]而不是f[u][i-j]?

為前文提到了,保留一條邊必須保留從根節點到這條邊路徑上的所有邊,那麼如果你想從u的子節點v的子樹上留邊的話,也要留下u,v之間的連邊

那麼取值範圍k為什麼要小於等於i−1而不是ii呢?

同上,因為要保留u,v連邊

對了,別忘了i,j要倒序列舉因為這是01揹包

#include#include

#define ll long long

#define fora(i,s,e) for(ll i=s;i<=e;i++)

#define fors(i,s,e) for(ll i=s;i>=e;i--)

using

namespace

std;

const ll n=1000

;ll n,m,num_edge,sz[n+1],head[n+1],f[n+1][n+1

];/*

f[u][j]表示的是樹根為u的子樹中保留j條樹枝的最多的蘋果數

sz[u]表示的是樹根為u的子樹的大小

*/struct

edgeedge[

2*n+2

];struct

messp[n+1

];inline

void add_edge(ll from

,ll to,ll dis)

,head[from]=num_edge;

}inline ll max(ll fa,ll fb)

inline ll min(ll fa,ll fb)

void

dfs(ll u,ll fa)

}}int

main()

dfs(

1,0);

printf(

"%lld

",f[1

][m]);

return0;

}/*5 21 3 1

1 4 10

2 3 20

3 5 20

*/

1.dp狀態設計自己一定要銘記

2.dp初始化與邊界處理

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,DFS)

題目鏈結 設f i j k 表示給以i為根節點的子樹分配j條可保留的樹枝名額的時候,狀態為k時能保留的最多蘋果。k有三種情況。k 1 我只考慮子樹的左叉,不考慮子樹的右叉,此時子樹能保留的最多的蘋果。k 2 我只考慮子樹的右叉,不考慮子樹的左叉,此時子樹能保留的最多的蘋果。k 3 我既考慮子樹的左叉...