這道題的dp還是先更新子節點,在更新父節點,不過問題就是怎樣更新他們
我們定義ff[i][j]為第i個節點字數上共保留j條邊的情況下最多的蘋果數,對於每乙個點,他保留的邊必然是他直接保留的之前保留的邊和他當前兒子保留的邊的值的和加上這一條邊的
邊權,即ff[u][i]=max(ff[u][i],f[u][i−j−1]+ff[v][j]+e[i].w)(1≤i≤min(q,son[u]),0≤j≤min(son[v],i−1))
然後不斷遞迴更新即可
----------------
#include#includeac#include
#include
#define ll long long
const
int maxn=105
;using
namespace
std;
intn,m,ff[maxn][maxn];
struct
be[maxn*2
];int
p;int
head[maxn];
void add(int f,int to,int
w)int
x,y,z;
intson[maxn];
void dfs(int now,int
f) }
}}int
main()
dfs(
1,-1);//
根節點是誰不重要
printf("
%d",ff[1
][m]);
return0;
}
P2015 二叉蘋果樹
題面 設f u i 表示u的子樹上保留i條邊,至多保留的蘋果數目 那麼狀態轉移方程也就顯而易見了 f u i max f u i f u i j 1 f v j e i w 1 i min q,sz u 0 j min sz v i 1 u表示當前節點,v是u的乙個子節點,sz u 表示u的子樹上的...
P2015 二叉蘋果樹
有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...
題解 P2015 二叉蘋果樹
題目鏈結 mathcal 這題是我在某奧賽一本通 提高篇 樹形dp中的第一道例題,抱著試一試的心態,本蒟蒻嘗試了這道題。在過了n小時後,終於做出了這題 以上純屬扯淡 首先,我們仔細看一下題目,可以發現 這是一棵樹呀!所以,我們就需要用到樹上dp。那麼,我們應該怎麼設定狀態呢?上面這張醜陋的圖,紅色的...