洛谷 P2015 二叉蘋果樹

2022-04-06 21:29:43 字數 952 閱讀 3020

樹形dp,\(f_\)表示以i為根,子樹刪j條邊的最少蘋果數

#include#include#includeusing namespace std;

int n,q,head[101],si[101],m,pp,ans,ss[101],ll[101],oo[101];

int f[101][101];

struct kkk e[500];

inline void add(int x,int y,int vv)

inline int dp(int rt,int fa,int le)

int sum = 0,len = 0,so[2],tot = -1;

for(int i = head[rt];i; i = e[i].next)

si[rt]++;

for(int i = 1;i <= min(m,si[rt] - 1); i++)

for(int k = 0;k <= 1; k++)//二叉樹,兩個兒子

for(int j = 0;j <= si[so[k]]; j++)

//因為一共刪i條,所以左子樹刪j條,那右子樹就刪i-j條

f[rt][i] = min(f[rt][i],f[so[k]][j] + f[so[k^1]][i-j]);

if(m >= si[rt]) f[rt][si[rt]] = ll[rt];

return si[rt];

}inline int dfs(int rt,int fa,int le)

return ll[rt] = ll[rt] + le;

}int main()

dfs(1,0,0);

dp(1,0,0);

printf("%d",ans - f[1][m]);

//總數減去最少去除量

return 0;

}

洛谷 P2015 二叉蘋果樹

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

洛谷P2015 二叉蘋果樹

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

洛谷P2015 二叉蘋果樹

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