前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >AcWing 1074. 二叉苹果树(树形dp)

AcWing 1074. 二叉苹果树(树形dp)

作者头像
glm233
发布2021-04-13 16:21:24
发布2021-04-13 16:21:24
32800
代码可运行
举报
运行总次数:0
代码可运行

状态表示 f[u][j]:表示所有以u为树根的子树中选,选j条边的最大价值 状态计算 每一棵子树看出一组背包,若需要选择该子树son,则根结点u到子树son的边一定用上,因此能用上的总边数一定减1,总共可以选择j条边时,当前子树son分配的最大边数是j - 1,对于任意一棵子树有

f[u][j] = max(f[u][j], f[u][j - 1 - k] + f[son][k]+ w[i])

代码语言:javascript
代码运行次数:0
复制
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=N<<1;
int n,m,ne[M],idx,h[N],e[M],w[M];
int f[N][N];
void add(int a,int b,int c){
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int fa){
    for(int i=h[u];~i;i=ne[i]){
        int k=e[i];
        if(k==fa)continue;
        dfs(k,u);
        for(int j=m;j>=1;j--){
            for(int b=0;b<j;b++){
                f[u][j]=max(f[u][j],f[u][j-b-1]+w[i]+f[k][b]);
            }
        }
    }
}
int main(){
    cin>>n>>m;
    memset(h,-1,sizeof h);
    for(int i=0;i<n-1;i++){
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c),add(b,a,c);
    }
    dfs(1,-1);
    cout<<f[1][m]<<endl;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档