最大权值和
2018-02-27 16:01
155 查看
一、题目
问题描述 有一棵 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的正整数。
二、分析
1、设dp[i][1]为编号为i的节点被选中时的最大权值,dp[i][0]为编号为i的节点不被选中时的最大权值和。2、通过二维数组来表示树,即tree[i][j]代表编号i的第j+1个孩子节点的编号
public class Question4 { // dp[i][1]表示第i个节点被选中时对应的权值,否则没有被选中 public static int[][] dp = new int[100002][2]; // 用二维数组(邻接矩阵)来表示树 // tree[i][3] =num表示第i个节点的第3个孩子节点为第num个节点 public static int[][] tree = new int[100002][300]; /** * * @param point1 * @param point2 */ public static void creatTree(int point1, int point2) { int i = 0; // 当第point1个节点为父母节点时 while (tree[point1][i] != 0) i++; // 如果第point1个节点已经有孩子了,再增加一个孩子 tree[point1][i] = point2;// 表示第point1个节点第i+1个孩子为point2 int j = 0; // 当第point2个节点为父母节点时 while (tree[point2][j] != 0) j++; tree[point2][j] = point1;// 表示第point2个节点的第j+1个孩子是point1 } /* * 参数satrt:开始对树进行DFS遍历的开始节点,为具体节点位置,不是节点权值 参数root:为第start个节点的直接父母节点位置, * root=0表示根节点的父母节点 */ public static void dfs(int start, int root) { int child = tree[start][0]; // 第start个节点的第1个孩子节点 for (int i = 0; child != 0; i++) { child = tree[start][i]; if (child != root) { // 防止出现start的孩子成为start的父亲情况 dfs(child, start); // 状态转移方程 dp[start][1] += dp[child][0]; dp[start][0] += (dp[child][1] > dp[child][0] ? dp[child][1] : dp[child][0]); } } } public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); for (int i = 0; i < n; i++) dp[i + 1][1] = in.nextInt(); for (int i = 0; i < n - 1; i++) { int point1 = in.nextInt(); int point2 = in.nextInt(); creatTree(point1, point2); } dfs(1, 0); // 从创建的数的根节点(即第1个顶点,0表示根节点的父母节点)开始进行DFS遍历 int max = (dp[1][1] > dp[1][0] ? dp[1][1] : dp[1][0]); System.out.println(max); } }
Weep no more,no sigh,nor groan,Sorrow calls no time that’s gone.
相关文章推荐
- 最大递增子序列变形——二维带权值 O(n*n) HDU1069
- POJ - 2253 Frogger (最大权值最小化)
- 最小生成树 prime算法 求权值最大的边
- Codeforces 542A. Place Your Ad Here (扫描线进阶 带权值的线段交求最大值) (线段树)
- RMQ -- 不修改的权值的求区间最大最小值
- [阿里] 给定二叉树,每条边都有权值 , 求二叉树中的最大路径
- 【Codeforces Round 362 (Div 2)F】【AC自动机+矩阵快速幂】Legen... 长度为l字符串最大能够重复匹配的字符串权值
- 二分图最大权值匹配KM算法
- 【杭电2015年12月校赛G】【map记录 状压DP 记忆化搜索实现 】Pick Game nm棋盘两人轮流取数 所取位置周围至少2个为空 为先手最大取得权值
- hdu 3367 Pseudoforest 最大权值和伪森林
- 计蒜客 The Heaviest Non-decreasing Subsequence Problem(最大权值和非递减子序列)
- hdu 2426 Interesting Housing Problem(最大权值匹配)
- 面试算法——权值最大的叶节点到权值最小的叶节点的距离
- 【HDU5735 2016 Multi-University Training Contest 2B】【暴力做法 + 折半法】Born Slippy 祖先链的最大运算权值
- 并查集+排序 的最长木材问题 求最小生成树的最大边权值问题
- poj2987(网络最大流求最大闭合子图权值)
- 【HDU1520】Anniversary Party-树形DP求树的最大权值独立集
- Hdu 5314 Happy King(求树上多少个点对(u,v)满足u到v的路径上点权值最大值减最小值不大于给定的K)
- 线段树 求一个序列的非递增子序列的权值和的最大值
- ZOJ-2362 Beloved Sons 最大权值匹配