樹上關於邊的0-1揹包問題。
因為這是一棵樹,所以當某條邊被保留下來時,從根節點到這條邊的路徑上的所有邊也都必須保留下來。
設dp[u][j]表示以u為根的子樹中,選取j條邊的最大值。
那麼轉移方程為:$dp[u][j]=max(dp[u][j],dp[u][j-1-k]+dp[v][k]+edge[i].val)$
u為當前節點,v是u的乙個子節點,sum[u]表示u的子樹上的邊數,m為最多保留邊數。
注意一些邊界:
如為何是dp[u][j-1-k]而不是dp[u][j-k]或者為何k的取值範圍要小於等於j-1而不是j:
因為這個子樹與u之間有一條邊,即u與v之間有一條邊,需要-1。
ac**:
1 #include2 #include3 #include4ac**using
namespace
std;
5const
int n=200;6
struct
nodeedge[n<<1];9
inthead[n],tot;
10int
sum[n],dp[n][n],n,m;
11void add(int u,int v,int
w)17
void dfs(int u,int
fa)27}28
}29}30
intmain()
38 dfs(1,-1
);39 printf("
%d\n
",dp[1
][m]);
40return0;
41 }
洛谷 P2015 二叉蘋果樹 樹形dp
有一棵蘋果樹,如果樹枝有分叉,一定是分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現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...
洛谷P2015 二叉蘋果樹 樹形dp)
題目描述 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 34 1現在這顆樹枝條太多了,需要剪枝。但是一些樹枝...