当前位置: 首页 > news >正文

luogu2015 二叉苹果树

 

  1. 题目

    【题目描述】 有一棵苹果树,如果树枝有分叉,一定是分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个。

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

    【代码】

/*
User:Mandy.H.Y
Language:c++
Problem:appletree
*/ 

#include<bits/stdc++.h>

#define Max(x,y) (x)>(y)?(x):(y)
#define Min(x,y) (x)<(y)?(x):(y)
#define mem(A) memset((A),0,sizeof(A))

const int maxn=102;

int n,q,first[maxn],size=0,f[maxn][maxn];

struct Edge
{
    int v,w,nt;
}edge[maxn<<1];

template<typename T>inline void read(T &x)
{
    x=0;char c=getchar();bool f=0;
    while(c<'0'||c>'9') {f|=(c=='-');c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+(c^48); c=getchar();}
    if(f)x=-x;
}

template<typename T>void putch(const T x)
{
    if(x>9) putch(x/10);
    putchar((x%10)|48);
}

template<typename T>inline void put(const T x)
{
    if(x<0) putchar('-'),putch(-x);
    else putch(x);
}

void docu()
{
    freopen("appletree.txt","r",stdin);
}

void eadd(int u,int v,int w)
{
    edge[++size].v=v;
    edge[size].w=w;
    edge[size].nt=first[u];
    first[u]=size;
}

void readdata()
{
    read(n);read(q);
    for(int i=1;i<n;++i)
    {
        int x,y,z;
        read(x);read(y);read(z);
        eadd(x,y,z);
        eadd(y,x,z);
    }
}

int dp(int u,int fa,int num,int ww)
{
    if(num<=0) return 0;
    if(f[u][num]) return f[u][num];
    int v[3],j=0,w[3];
    f[u][num]+=ww;
    if(num==1) return f[u][num];
    for(int i=first[u];i;i=edge[i].nt)
    {
        int v1=edge[i].v,w1=edge[i].w;
        if(v1==fa) continue;
        v[++j]=v1;
        w[j]=w1;
    }
    if(j==0) return f[u][num];
    for(int j=0;j<num;++j)
    {
        f[u][num]=Max(f[u][num],ww+dp(v[2],u,num-j-1,w[2])+dp(v[1],u,j,w[1]));
    }
    return f[u][num];
}

void work()
{
    put(dp(1,0,q+1,0));
}

int main()
{
//  docu();
    readdata();
    work();
    return  0;
}

 

转载于:https://www.cnblogs.com/Mandy-H-Y/p/11355027.html

相关文章:

  • Docker安装LogonTracer
  • 代码安全审计工具
  • spring中bean配置和bean注入
  • Windows下同时安装python2和python3如何兼容版本
  • 极客时间-左耳听风-程序员攻略-技术资源集散地
  • 处理提交html危险代码的异常方法
  • JUC 总结
  • 信息收集-DNS记录查询
  • JSON Hijacking漏洞
  • Failure [DELETE_FAILED_INTERNAL_ERROR]之后rm apk卸载
  • 浏览器中的文件传输过程
  • 面试常考 大数加减乘除
  • Hibernate一级缓存Session和对象的状态
  • hash值生成表后缀(分表方案)
  • 批处理提权命令
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Js基础——数据类型之Null和Undefined
  • PaddlePaddle-GitHub的正确打开姿势
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue 重置组件到初始状态
  • Vue组件定义
  • webpack4 一点通
  • 阿里云应用高可用服务公测发布
  • 闭包--闭包之tab栏切换(四)
  • 基于webpack 的 vue 多页架构
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 区块链共识机制优缺点对比都是什么
  • 使用权重正则化较少模型过拟合
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​如何防止网络攻击?
  • #mysql 8.0 踩坑日记
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (SpringBoot)第七章:SpringBoot日志文件
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (转)负载均衡,回话保持,cookie
  • .NET CLR Hosting 简介
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET面试题(二)
  • .net下的富文本编辑器FCKeditor的配置方法
  • .NET中使用Redis (二)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @PostConstruct 注解的方法用于资源的初始化
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [AI StoryDiffusion] 创造神奇故事,AI漫画大乱斗!
  • [C#]winform部署yolov5-onnx模型