洛谷P2015 二叉苹果树

洛谷P2015 二叉苹果树

题意:

给一棵二叉树,每条边有一个权值,去掉某些边之后,使剩下的二叉树边的权值之和最大

分析:

这是一个典型的树状DP题
状态转移方程: d p [ k ] [ u ] = m a x ( d p [ k ] [ u ] , d p [ k ] [ u v ] + d p [ s o n ] [ v 1 ] + v a l [ k ] [ i ] ) dp[k][u] = max(dp[k][u], dp[k][u - v] + dp[son][v - 1] + val[k][i]) dp[k][u]=max(dp[k][u],dp[k][uv]+dp[son][v1]+val[k][i])
d p [ k ] [ u ] dp[k][u] dp[k][u] 表示以编号为k的节点作为根节点的子树上留下来u条边时保留的最大苹果数
详解见注释中

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int dp[maxn][maxn];
int n, q;
bool vis[maxn] = {0};              //标记已经访问过的点
vector<int> edge[maxn], val[maxn]; //edge数组存边的情况,val数组存边的权值
int dfs(int k)
{
    vis[k] = 1;
    int cnt = 0; //cnt记录当前以k为根节点的子树所包含的节点数目
    for (int i = 0; i < edge[k].size(); ++i)
    {
        int son = edge[k][i];
        if (vis[son]) //已访问过的节点不再访问
            continue;
        cnt += dfs(son) + 1;

        for (int u = min(cnt, q); u > 0; --u)
        {
            for (int v = min(u, q); v > 0; --v)
                dp[k][u] = max(dp[k][u], dp[k][u - v] + dp[son][v - 1] + val[k][i]); //dp[k][u - v]表示以k为根节点的树上除去以son为根节点的子树后保留u-v条边所能保留的最大苹果数
                                                                                     //dp[son][v-1]表示以son为根节点的子树上保留v-1条边所能保留的最大苹果数
                                                                                     //u-(u-v)-(v-1)=1即k节点和son节点之间的边
                                                                                     //因为存入时edge和val相对应,所以val[k][i]即是节点k和son之间边的权值
        }
    }
    return cnt;
}
int main(int argc, char const *argv[])
{
    scanf("%d%d", &n, &q);
    int u, v, x;
    for (int i = 1; i < n; ++i)
    {
        scanf("%d%d%d", &u, &v, &x);
        edge[u].push_back(v);
        edge[v].push_back(u);
        val[u].push_back(x);
        val[v].push_back(x);
    }
    dfs(1);
    printf("%d\n", dp[1][q]);
    return 0;
}
全部评论

相关推荐

02-01 12:05
复旦大学 Java
腾讯的提前批大概率应该是没有笔试的,但是这个时候有相当部分的同学简历估计都没有准备好,没准备好的同学也不用急,大部分都是3月之后开,这个时候开的绝大多数都是神仙打架,问的东西也比较难,打算投递的同学也多看下计算机网络和操作系统,腾讯对这部分的知识问的比较多。另外多刷下牛客的热门题库,刷题注意刷ACM模式,和牛客的周赛题,腾讯有的部门会从这里面出原题。我是@程序员花海关注我,带你了解更多校招资讯!
程序员花海:还没有来得及准备的同学可以看下学习路线:https://www.nowcoder.com/discuss/824693499982315520?sourceSSR=users算法题:https://www.nowcoder.com/feed/main/detail/20e7a999fa04485b88340a274411ca0d?sourceSSR=users八股文:https://www.nowcoder.com/discuss/833102362771251200?sourceSSR=users简历书写方式:https://www.nowcoder.com/discuss/839907820706205696?sourceSSR=users都是以前在牛客发的文章~
软开人,秋招你打算投哪些...
点赞 评论 收藏
分享
2025-12-19 19:39
青海大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务