樹形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現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...