二 蘋果樹 樹型動態規劃

2021-07-11 15:12:20 字數 1504 閱讀 7523

題目大意

對於乙個二叉樹,除根節點外,每個節點都有相應的乙個權值。在此基礎上,求保留多少個點使得其仍然滿足樹的性質且權值總和最大。分析

先建樹。

ch[v,1],ch[v,2]分別存v節點的左右孩子。dp[v,l]存以v為根的樹保留l個節點的最大權和。num[v]為點v的權值。

dp[v,l]=max (0<=j<=l-1)

這裡特別指出,為了使其仍然為二叉樹,我們一定要保留根節點,因此j<=l-1。

然後,可以減枝。

然後2,注意邊界:

如果l=0,那麼dp[v,l]=0。

如果點v沒有孩子,那麼dp[v,l]=v的權值。

然後3,因為輸入的是要保留m條邊,而轉化後的題目是保留nm個點,所以輸入的m要加1.**

varf:array[0..200,0..200] of longint;

a:array[0..200,1..3] of longint;

b:array[0..200,0..200] of longint;

v,num:array[0..200] of longint;

i,j,k,l:longint;

n,m:longint;

ans:longint;

procedure make(v:longint);

var i,j,k:longint;

begin

for i:=1 to n do

begin

if b[v,i]>0 then

begin

a[v,1]:=i;

num[i]:=b[v,i]-1;

b[v,i]:=-1; b[i,v]:=-1;

make(i);

break;

end;

end;

for i:=1 to n do

begin

if b[v,i]>0 then

begin

a[v,2]:=i;

num[i]:=b[v,i]-1;

b[v,i]:=-1; b[i,v]:=-1;

make(i);

break;

end;

end;

end;

procedure dfs(r,l:longint);

var i,j,k:longint;

begin

if f[r,l]<>0 then exit;

if l=0

then

begin

f[r,l]:=0;

exit;

end;

if (a[r,1]=0) and (a[r,2]=0)

then begin

f[r,l]:=num[r];

exit;

end;

for i:=0 to l-1 do

begin

dfs(a[r,1],i);

dfs(a[r,2],l-i-1);

if f[r,l]

1661 二 蘋果樹 樹型DP

有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...

二叉蘋果樹 樹型DP 揹包

二叉蘋果樹 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 現在這顆樹枝條太多了,需要剪枝。但是一些樹...

二叉蘋果樹

我們可以把保留邊轉換成保留點 因為我個人對保留點熟 跟據樹的性質,乙個點有0or1個根。所以我們可以把邊上的蘋果數轉移到子節點上。根據題意可知這應是一道dp題 廢話 設f i j 為以i為根的樹上保留j個節點的最大權值和,又因為這是個二叉樹,所以我們不妨設左子樹要保留的節點數為k,那麼右子樹的需要保...