P2015 二叉苹果树

有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)

这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。

我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树

2 5
\ /
3 4
\ /
1
现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。

给定需要保留的树枝数量,求出最多能留住多少苹果。

输入格式#
第1行2个数,N和Q(1<=Q<= N,1<N<=100)。

N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。

每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。

每根树枝上的苹果不超过30000个。

输出格式#
一个数,最多能留住的苹果的数量。

输入输出样例#
输入 #1复制
5 2
1 3 1
1 4 10
2 3 20
3 5 20
输出 #1复制
21

题解:
  树形背包模板题,考虑到每次删减最小的边有后效性,无法得出正解可以考虑背包
  f[u][i]表示以u为根节点的拥有i条边的子树拥有的最大苹果数量。
  显然转移方程可以写成:
      f[u][i] = max(f[u][i], f[u][i - j + 1] + f[v][j] + w[i])
  接着直接套树形背包的模板即可。

#include <bits/stdc++.h>
#define dbug(x) cout << #x << "=" << x << endl
#define eps 1e-8
#define pi acos(-1.0)

using namespace std;
typedef long long LL;

const int inf = 0x3f3f3f3f;

template<class T>inline void read(T &res)
{
   char c;T flag=1;
   while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
   while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}

const int maxn = 2e5 + 7;

int n, q;

int cnt, w[maxn], head[maxn], nxt[maxn], edge[maxn];
int ans = 0;

int f[107][107];

void BuildGraph(int u, int v, int c) {
    ++cnt;
    edge[cnt] = v;
    nxt[cnt] = head[u];
    head[u] = cnt;
    w[cnt] = c;
}

void dfs(int u, int fa) {
    for ( int i = head[u]; i; i = nxt[i] ) {
        int v = edge[i];
        if(v == fa) {
            continue;
        }
        dfs(v, u);
        for ( int j = q; j; --j ) {
            for ( int k =j - 1; k >= 0; --k ) {
                f[u][j] = max(f[u][j], f[u][j - k - 1] + f[v][k] + w[i]);
                // printf("f[%d][%d]:%d\n",u, j, f[u][j]);
            }
        }
    }
}

int main()
{
    read(n); read(q);
    for ( int i = 1; i <= n - 1; ++i ) {
        int u, v, w;
        read(u); read(v); read(w);
        BuildGraph(u, v, w);
        BuildGraph(v, u, w);
    }
    dfs(1, 1);
    for ( int i = 1; i <= n; ++i ) {
        ans = max(f[i][q], ans);
    }
    ans = f[1][q];
    cout << ans << endl;
    return 0;
}
全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务