2015年蓝桥杯第十题——生命之树(无根树dfs)

①暴力解法:枚举子集(选点) + dfs判断连通性(题目要求连通)满足上面两个条件下找出最大值权值和

②dfs无根树转有根树,递归找最优

先学习无根树转有根树

参考博客:https://blog.csdn.net/Originum/article/details/82258450

参考博客:https://www.cnblogs.com/yspworld/p/4270876.html

无根树转有根树模板
void dfs(int cur, int father) {
for (int i = 0; i < tree[cur].size(); i++) {
int son = tree[cur][i].v;
if (son != father) {
dfs(son, cur);
//
}
}
}

这道题思路:从根(任选一个作为根)出发,自根向下递归、自下向上回溯,选取最优(dp),每个节点都有两种选择(要、不要这个点)

无根树的每个节点是平等的,选不同的根没有区别。

代码:树上找最优



3.树形dp

学习视频:https://www.bilibili.com/video/av12194537?from=search&seid=7177934246567735469

代码参考



使用dp数组存放 选当前节点和不选当前点的两种状态

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int v[100004];
int dp[100004][2];//表示选择了当前节点和不选择的最大分数
int vis[100004];
vector<int> node[100004];
void dfs(int t)
{
dp[t][1] = v[t];
dp[t][0] = 0;
vis[t] = 1;
for (int i = 0; i < node[t].size(); i++)
{
if (!vis[node[t][i]])//如果这个节点没有走过的话
{
dfs(node[t][i]);//继续往下寻找子节点
dp[t][1] += max(dp[node[t][i]][0], dp[node[t][i]][1]);//+=是表示选当前节点时,当前节点加上当前节点的子节点的最大序列和
}
else//这个子节点是不能走的
{
dp[t][1] = max(dp[t][1], v[t]);//所以就比较当前序列和与当前节点的分值的大小比较
dp[t][0] = max(dp[t][0], 0);
}
}
}
int main()
{
int n;
cin >> n;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)
{
cin >> v[i];//输入分数
}
int u, v;
for (int i = 1; i < n; i++)
{
cin >> u >> v;
node[u].push_back(v);
node[v].push_back(u);
}
dfs(1);
int ans = -99999;
for (int i = 1; i <= n; i++)
{
ans = max(dp[i][1], ans);
ans = max(dp[i][0], ans);
}
cout << ans << endl;
system("pause");
return 0;
}

另外一道类似的树形dp例题:没有上司的舞会

思路

代码

树形dp|无根树转有根树|2015年蓝桥杯生命之树的更多相关文章

  1. 2015年蓝桥杯B组C/C++决赛题解

    2015年第六届蓝桥杯B组C/C++决赛题解 点击查看2015年第六届蓝桥杯B组C/C++国赛题目(不含答案)     1.积分之迷 三重循环 枚举A,B,C的值,如果满足两个条件:3个A + 7个B ...

  2. 2015年蓝桥杯B组C/C++决赛题目

    2015年第六届蓝桥杯B组C/C++国赛题目 点击查看2015年第六届蓝桥杯B组C/C++国赛题解     1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会 ...

  3. 垒骰子|2015年蓝桥杯B组题解析第九题-fishers

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  4. 加法变乘法|2015年蓝桥杯B组题解析第六题-fishers

    加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+1011+12+...+2728+29+ ...

  5. 星系炸弹|2015年蓝桥杯B组题解析第二题-fishers

    星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2 ...

  6. 蓝桥杯 生命之树【树状dp】

    生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上, 都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S, 使得对于S中的任意两个点a,b ...

  7. 2015年蓝桥杯java b组第十题

    10. 生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a ...

  8. 2015年蓝桥杯省赛A组c++第5题(回溯算法填空)

    /* 1,2,3…9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. */ #include <stdio.h> void tes ...

  9. 2015年蓝桥杯省赛A组c++第8题(迭代法)

    /* 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料, 并且可以一直循环下去(但不允许暂借或赊账). 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于 ...

随机推荐

  1. SQLAllocHandle

    函数定义: 顾名思义,该函数就是用来分配句柄的,句柄类型参考参数详解. SQLRETURN SQLAllocHandle( SQLSMALLINT     HandleType, SQLHANDLE  ...

  2. Intel 80386 微处理器的存储器管理

    一.存储器的管理       存储器的管理是一种硬件机制,微处理器在总线地址上对物理存储器进行寻址.但是,为了给程序提供比物理存储器容量更大的空间,就引入了虚拟存储器的概念,它在外存(比如磁盘)的支持 ...

  3. libvirt_python

    一.Connections 连接函数接口libvirt.open(name); //可读写方式连接上QEMU 参数说明: name:连接名称libvirt.openAuth(uri, auth, fl ...

  4. ENode, 领域模型,DDD

    Entity Framework之领域驱动设计实践 使用ENode框架前您需要了解的东西(初稿) 领域驱动设计实战--战略建模 http://www.cnblogs.com/yubaolee/p/Ca ...

  5. javascript常用积累

    一.JS动画与动作不一致解决: if(!$( "#handle").is(":animated")){ //判断元素是否处于动画状态 } 二.停止事件冒泡 ev ...

  6. Logstash进程杀不掉

    由于ELK磁盘不足,对磁盘进行扩容,重启服务器,重启之后发现自动起来了一个logstash进程,PID一直变,无法杀掉,极其耗费CPU logstash 是通过rpm方式安装的,版本是6.2.2 解决 ...

  7. js 显示刚刚上传的图片 (onchange事件)

    <table> <tr width="100"> <td>上传商场图片:</td> <td> <input typ ...

  8. IntelliJ IDEA. Debug模式

    资料收集: https://www.bilibili.com/video/av6749471/?p=16 eclipse debug模式. 基础 Intellij Idea--Debug使用 Inte ...

  9. linux下nginx编译安装

    步骤: 1.获取nginx安装包. 进入nginx官网:http://nginx.org/ 找到稳定版本: 点击红框内的链接. 使用wget获取安装包. wget http://nginx.org/d ...

  10. Kafka学习笔记之为什么使用Kafka

    在介绍为什么使用kafka之前,我们有必要来了解一下什么是kafka? 0x00 什么是kafka Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐 ...