題目鏈結
題意:
給一棵樹,每個邊都有權值,選擇一些邊刪除,剩餘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現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...