蓝桥杯 节点选择

问题描述
有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?

输入格式
第一行包含一个整数 n 。

接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。

接下来一共 n-1 行,每行描述树上的一条边。

输出格式
输出一个整数,代表选出的点的权值和的最大值。
样例输入
5
1 2 3 4 5
1 2
1 3
2 4
2 5
样例输出
12
样例说明
选择3、4、5号点,权值和为 3 4 5 = 12 。
数据规模与约定
对于20%的数据, n <= 20。

对于50%的数据, n <= 1000。

对于100%的数据, n <= 100000。

权值均为不超过1000的正整数。

分析

  • 看到蓝桥杯的树形dp题,刚开始看的很蒙蔽。从来没做过树形的dp,刚开始表示很难理解,当时主要的疑惑点有一下几点:
    1:这个树怎么解决?这么乱的一棵树感觉根本无法下手,因为你不知道那个是根节点,那个是子节点。输出的结果又和那个有关系?
    2:树形怎么dp?以前都是遇到线性区间的dp,树形dp,怎么查找连续点,就算找到连续的点交叉点如何处理?
  • 看了一些博客和文章之后,有了解到dp处理树形的特殊手段:
    : 一般来说,树形dp的每个节点都有一个选择性,本题就是该店选择和不选择,dp[i][0]表示不选择,dp[i][1]表示选择该节点。
    :对于树形dp,一般要和搜索结合(更确切的说是递归)结合,对于树的划分层次,一般是选择一个点,然后从这个点进行往下搜索 ,他的邻居都变成他的子节点。也就是相当于从这个根节点除法,可能有很多分叉。也就是有很多分叉会到根节点。但是这有和dp有啥关系呢?dp是从尾到头还是从头到尾?
    :对于顺序的选择肯定是从尾部到顶部,因为dp要的是一个整合结果而不是分散求最值或者其他。那么还有问题就是那么多的跟节点,那么多合的点,还有反向路径不好记录,记录的难度和开销都超级大。如果从尾部推到dp还是有一定难度。
    :我们要先抛开整体看局部这个点,对于某个单点来说(如果他是头节点),分析到他的结果,如果取他那么他的儿子们都不能取,那么dp[i][1]=dp[儿子们][0] value[i];如果不取他,那么对于每个儿子来说要给最大的,那么dp[i][0]=max(dp[每个儿子][0],dp[每个儿子][1]);这样就得到递推式dp[x][0]=sum(max(dp[num][0],dp[num][1]));dp[x][1]=sum(dp[num][0]) value[i].
    :对于头节点(可以任选),满足④,对于头节点的儿子也同样满足④,但是唯一不同的是要过滤头节点(准确的说是父节点)。防止死循环。递归搜索的过程是双向的过程,先去再回,我们可以同过先去构造树并且获得后面的一些信息,然后根据后来得到的值进行操作当前等级的dp。
  • 总的来说这个树形dp就是分析某个点的状态方程,通过递归搜索进行划分树。获得结果。并且这题只有n-1条路径,n个点,不用考虑去重。
    附上代码:
package 算法训练;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.List;
public class 节点选择 {// static boolean jud[];static int dp[][];//dp数组static int value[];//保存权值static List <Integer>[]list;//邻接表储存图。节省空间public static void main(String[] args) throws IOException {// TODO 自动生成的方法存根StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));in.nextToken();int n=(int)in.nval;value=new int[n];//权值dp=new int[n][2];list=new ArrayList[n];for(int i=0;i<n;i++) {list[i]=new ArrayList<>();}for(int i=0;i<n;i++){in.nextToken();value[i]=(int)in.nval;}for(int i=0;i<n-1;i++){in.nextToken();  int t1=(int)in.nval;in.nextToken();int t2=(int)in.nval;list[t1-1].add(t2-1);//添加路径list[t2-1].add(t1-1);           }dfs(0,-1);//理论上任意n之内节点都可以,但是右侧第一个理论上保证不是这个点的父亲int value=max(dp[0][0], dp[0][1]);out.println(value);out.flush();}private static void dfs(int x, int y) {//当前节点,父亲节点for(int i=0;i<list[x].size();i++){int num=list[x].get(i);if(num!=y)//不是父亲节点{dfs(num,x);dp[x][0]+=max(dp[num][0],dp[num][1]);dp[x][1]+=dp[num][0];}}dp[x][1]+=value[x];//加上自己的权值}private static int max(int i, int j) {// TODO 自动生成的方法存根return i>=j?i:j;}}

但是结果只能过7个,

看了下其他人没优化输入的只能过5个超时。我用测试数据测试了一下原因是栈内存溢出。苦逼的Java。。

也可能是因为我比较菜,,想不出好的方法,呵呵,。欢迎大佬踢场。。

蓝桥杯节点选择(java)第一道树形dp分析相关推荐

  1. hdu 1520 Anniversary party(第一道树形dp)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  2. [蓝桥杯]算法提高 金属采集(树形dp)

    问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连,所有的节点和道路形成了一棵树.一共有 n 个节点,这些节点被编号为 1~n .人类将 ...

  3. 蓝桥杯-最大最小公倍数java语言

    蓝桥杯-最大最小公倍数java语言 开局一句话: 做这道题的时候,便没有对最小公倍数十分了解,就直接写了,也是惭愧,走了太多弯路,后来才知道,最小公倍数不是单单的几个数相乘就完了. 问题描述: 已知一 ...

  4. 2013蓝桥杯java试题_蓝桥杯2013决赛java本科b组试题.doc

    蓝桥杯2013决赛java本科b组试题.doc 试题一:公式求值问题描述输入n,m,k,输出下面公式的值.其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如 ...

  5. 蓝桥杯 拿金币 java实现

    蓝桥杯 拿金币 java实现(通俗易懂) 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币.你站在最左 ...

  6. 蓝桥杯软件类Java语言IDE(Eclipse)安装

    蓝桥杯软件类Java语言IDE(Eclipse)安装以及个性化设置 平时都在用idea搞工程类项目,正好报了下学期的蓝桥杯算法比赛,看到官网要求用eclipse编码,之前也参加过ccf-csp的比赛, ...

  7. 蓝桥杯单片机第十一届第一场省赛-多功能电压测量装置

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第十一届第一场省赛-多功能电压测量装置 Notes1:矩阵按键的灵活使用 Notes2:AT24 ...

  8. 2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛)

    2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛) A:ASC B:卡片 C:直线 D:货物摆放 E:路径 Floyed Dijkstra F:时间显示 G:最少砝码 H:杨辉三角形 I: ...

  9. 2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数

    2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数 在线评测 Ideas 对于一个纯循环小数,假设循环节为l,则小数为0.llll-,转换为分数就是 l / (10 ** n ...

最新文章

  1. java中自造类是什么意思_Java建造者模式是什么?如何实现?(附代码)
  2. ckeditor富文本编辑器的基本配置设置:
  3. 用python实现点阵屏_MicroPython拼插编程实例:点亮心形8x8点阵
  4. Xshell怎么把界面信息(终端信息)输出到log(打印到文本文件)
  5. Java学完可以应用在什么领域?这8大领域你要知道
  6. leetcode 501. 二叉搜索树中的众数(Java版)
  7. 关于Qt、Qt/E、Qtopia、qvfb、framebuffer、qpe等概念的对比介绍
  8. 用lnmp.org中的lnmp下安装ftp(pureftp)
  9. asp.net mvc 点滴 一 asp.net mvc vs asp.net web forms
  10. 安装阿里Java代码规约插件
  11. 实现nav_微信小程序——沉浸式导航栏实现(含iphoneX适配和组件封装)
  12. 概率图模型-贝叶斯网络
  13. PG数据库 创建自增序列 创建序列 查询序列 使用序列
  14. JS对象定义和基本方法
  15. 联想Filez zBox2022企业版为企业的 “零信任体系”构建保驾护航
  16. C++ Copy Elision 1
  17. 认识程序集:1. 程序集的生成
  18. WordPress 不修改代码通过sql语句修改数据库批量增加文章阅读量
  19. Linux之kickstart全自动安装
  20. 泛微ecology 公文管理功能相关的几张表

热门文章

  1. 近世代数--环同态--环同态基本定理
  2. [计算机网络 谢希仁] 第一章
  3. buu 密码学的心声
  4. Fabric--测试链码
  5. Mysql存储级别_mysql 存储引擎分类和事务隔离级别
  6. 分享超全的 Linux 渗透测试命令速查表
  7. c/c++字符串混淆工具
  8. Windows保护模式学习笔记(七)—— PDEPTE
  9. 160个Crackme037
  10. 【Git Bash】在window 下,设置打开gitbash快捷键、修改默认路径