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. Robot framework selenium driver download

    Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads http://npm.taobao.org/mirrors ...

  2. caffe_ssd学习-用自己的数据做训练

    几乎没用过linux操作系统,不懂shell编程,linux下shell+windows下UltraEdit勉勉强强生成了train.txt和val.txt期间各种错误辛酸不表,照着examples/ ...

  3. arm cortex-m0plus源码学习(二)AMBA3.0_ AHBLite

    1. AMBA总线概述 AMBA2.0 以上版本都是基于单沿时钟.单向信号线的协议[1]. 现在市场上大部分的基于 AMBA 架构的 SoC 产品, 系统总线采用 AHB, 外部总线采用 APB.系统 ...

  4. 设计模式之Adapter(适配器)(转)

    定义: 将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用? 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是 ...

  5. Linux基础命令---显示域名ypdomainname

    ypdomainname   ypdomainname指令显示由函数“getdomainname”返回的主机域名,使用这个指令也可以设置一个主机NIS/YP域名. 此命令的适用范围:RedHat.RH ...

  6. 转:C#判断ContextMenuStrip右键菜单的来源(从哪个控件弹出来的)

    转载自:http://hi.baidu.com/cookiemulan/item/82df8ff867dd53cc531c26c7 有时候,为了提高性能和节约资源,我们会为多个控件,指定同一个右键弹出 ...

  7. Mybatis 在 insert 之后想获取自增的主键 id

    记录一次傻逼的问题, 自己把自己蠢哭:Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要 ...

  8. vue之component

    因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data.computed.watch.methods 以及生命周期钩子等.仅有的例外是像 el 这样根实例特有的选 ...

  9. <转>jmeter(三)SOAP/XML-RPC Request

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  10. 每天学点Linux命令之grep 和 wc命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...