題目鏈結
樹上零一dp
記憶化搜尋
如果是空結點
如果是葉子結點直接返回蘋果數
以上都不滿足的話,dp狀態轉移
設定dp的轉移,轉移到左右兒子結點
for(int i=1;i結果31分
1.說白了,記憶化搜尋還不是掌握的特別好
2.其次狀態設計不是特別好,在儲存左右兒子時,應該該需要儲存邊的
#include#include記憶化搜尋,樹型揹包dp#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
*/
這道題有乙個隱含的條件,當某條邊被保留下來時,從根節點到這條邊的路徑上的所有邊也都必須保留下來
設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#include1.dp狀態設計自己一定要銘記#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
*/
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 我既考慮子樹的左叉...