奆佬求助

P2015 二叉苹果树

有人吗QAQ
by Geirangerfjard @ 2023-02-23 21:38:48


与根相连的两根树枝至少要留一根
by xiaosi4081 @ 2023-02-25 16:37:45


@[xiaosi4081](/user/343531) 那请问应该怎么改呢
by Geirangerfjard @ 2023-02-27 09:27:09


你如果全部分给右边的话,右边可以有$j-1$条边,而你写了$k-1$,$k-1$是左边的边数-1,是错的 ```cpp #include <iostream> const int N = 1001; using namespace std; int n, q; int x, y, c, tot; int h[N], e[N], ne[N], to[N], f[N][N]; int ls[N], rs[N], lapp[N], rapp[N]; //f[i][j] 表示以 i 为根节点 保留 j 根树枝时的最大值 void add(int x, int y, int z) { ne[++ tot] = h[x]; h[x] = tot; e[tot] = z; to[tot] = y; } void build(int x, int fa)//当前节点 父亲节点 { int cnt = 0; for (int i = h[x]; i; i = ne[i]) { int s = to[i]; if (s != fa) { cnt ++; if (cnt == 1) ls[x] = s, lapp[x] = e[i]; else rs[x] = s, rapp[x] = e[i]; build(s, x); } } } int find(int x, int j) { // cout<<x<<" "<<j<<"\n"; if (ls[x] == 0 && rs[x] == 0) return 0; if (j == 0) return 0; if (f[x][j] > 0) return f[x][j]; // cout<<f[x][j] <<" "<< x <<" "<<j<<" "<<rapp[x] <<" " << lapp[x] <<"\n"; for (int k = j; k >= 0; k -- )//分配给左儿子的枝数 k { // cout<<k<<" "; // cout<<j<<" "; // cout<<(k==j ? 1 : 0)<<" "; // cout<<rs[x]<<" "; if (k == j) { f[x][j] = max(f[x][j], find(ls[x], k - 1) + lapp[x]);//全部给右 continue; } else if (k == 0){ // cout<<k-1; // cout<<find(rs[x], j - 1); f[x][j] = max(f[x][j], find(rs[x] , j -1) + rapp[x]);//全部给左 } else if(k != j && k != 0){ f[x][j] = max(f[x][j], find(ls[x], k - 1) + lapp[x] + find(rs[x], j - k - 1) + rapp[x]);//两边都有 } } return f[x][j]; } int main() { cin >> n >> q; for (int i = 1; i <= n - 1; i ++ ) { cin >> x >> y >> c; add(x, y, c); add(y, x, c);//惊现yxc } build(1, 0); cout << find(1, q) << endl; } ```
by Linyize257 @ 2023-03-01 17:50:19


@[Linyize257](/user/485014) 过了,感谢奆佬 ~~话说以后能不能@一下,不然看不到信息QAQ~~
by Geirangerfjard @ 2023-03-05 14:26:56


e
by Linyize257 @ 2023-03-06 13:18:35


@[Alone_Helpless](/user/823773) ok
by Linyize257 @ 2023-03-06 13:19:39


|