P2015 二叉蘋果樹 樹形dp 01揹包

2021-10-02 11:02:25 字數 1280 閱讀 8618

題目鏈結

題意:

給一棵樹,每個邊都有權值,選擇一些邊刪除,剩餘m條邊。問刪除後所有變得權值和最大是多少?

樹形dp 01揹包問題;

dp陣列:dp[maxn][maxn] ;

dp[x][i] 代表x為根節點的子樹上有i條邊的最大權值;

轉移方程:

num[x]為子樹上目前有多少邊,為什麼說目前呢? 因為子節點還沒遍歷完,

for

(int j =

min(m,num[x]

); j >

0; j --

)for

(int k =

0; k <=

min(j -

1,num[v]

); k ++

) dp[x]

[j]=

max(dp[x]

[j],dp[v]

[k]+ dp[x]

[j - k -1]

+ t.second)

;

因為如果最後剩餘的有v這個子樹上的邊的話,那麼x節點與v節點之間的邊肯定不能刪,所以就是j-k-1;然後再加上這條邊。

我還是想不到dp陣列能代表點啥。還是菜了;

上**:

#include

#include

#include

#include

using

namespace std;

typedef pair<

int,

int> pii;

const

int maxn =

105;

vector vv[maxn]

;int dp[maxn]

[maxn]

;//dp[x][i] 表示x的字數上保留i條邊得到的權值最大值

int num[maxn]

;int m;

void

dfs(

int x,

int f)

// printf("%d ",dp[x][j]);

}// printf("\n");

}// printf("\n %d %d \n",m,x);

}int

main()

dfs(1,

0);printf

("%d\n"

,dp[1]

[m])

;}

P2015 二叉蘋果樹(樹形dp)

題目傳送門 description 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 34 1現在這顆樹枝條太多...

樹形dp入門 P2015 二叉蘋果樹

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

洛谷 P2015 二叉蘋果樹 樹形dp

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