结点选择(树形DP)
Description
Input
接下来一共 n-1 行,每行描述树上的一条边。
Output
Sample Input
5
1 2 3 4 5
1 2
1 3
2 4
2 5
Sample Output
12
HINT
样例说明
选择3、4、5号点,权值和为 3+4+5 = 12 。
数据规模与约定
对于20%的数据, n <= 20。
对于50%的数据, n <= 1000。
对于100%的数据, n <= 100000。
权值均为不超过1000的正整数。
经典树形DP
用dp[i][0]表示不选择i点时,i点及其子树能选出的最大权值,dp[i][1]表示选择i点时,i点及其子树的最大权值。
对于叶子结点:
dp[k][0] = 0;
dp[k][1] = k点权值;
对于非叶子结点:
dp[i][0] =∑max(dp[j][0], dp[j][1]); (j是i的儿子)
dp[i][1] = i点权值 +∑dp[j][0]; (j是i的儿子)
最后树的最大权值即为:max(dp[1][0], dp[1][1])。(要么不包括根结点,要么包括根结点)
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
using namespace std; int n;
int dp[][];
int vis[];
vector<int> vt[]; void DFS(int st)
{
vis[st]=;
for(int i=;i<vt[st].size();i++)
{
int to=vt[st][i];
if(!vis[to])
{
DFS(to);
dp[st][]+=dp[to][];
dp[st][]+=max(dp[to][],dp[to][]);
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&dp[i][]);
for(int i=;i<=n-;i++)
{
int a,b;
scanf("%d %d",&a,&b);
vt[a].push_back(b);
vt[b].push_back(a);
}
DFS();
printf("%d\n",max(dp[][],dp[][]));
return ;
}
-
结点选择(树形DP)的更多相关文章
- hustoj1353 节点选择 树形dp
1353: 结点选择 时间限制: 1 Sec 内存限制: 128 MB提交: 6 解决: 2[提交][状态][讨论版] 题目描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值. ...
- 树形DP UVA 1292 Strategic game
题目传送门 /* 题解:选择一个点,它相邻的点都当做被选择,问最少选择多少点将所有点都被选择 树形DP:dp[i][0/1]表示当前点选或不选,如果选,相邻的点可选可不选,取最小值 */ /***** ...
- 【树形DP】JSOI BZOJ4472 salesman
题目内容 vjudge链接 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇 之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收 益.这些 ...
- 61-结点选择(树形dp)
http://lx.lanqiao.cn/problem.page?gpid=T14 算法训练 结点选择 时间限制:1.0s 内存限制:256.0MB 问题描述 有一棵 n 个 ...
- POJ1947 Rebuilding Roads(树形DP)
题目大概是给一棵树,问最少删几条边可以出现一个包含点数为p的连通块. 任何一个连通块都是某棵根属于连通块的子树的上面一部分,所以容易想到用树形DP解决: dp[u][k]表示以u为根的子树中,包含根的 ...
- 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】
树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...
- POJ1947 - Rebuilding Roads(树形DP)
题目大意 给定一棵n个结点的树,问最少需要删除多少条边使得某棵子树的结点个数为p 题解 很经典的树形DP~~~直接上方程吧 dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v] ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- poj2378 树形DP
C - 树形dp Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:65536KB 64bit ...
随机推荐
- Web安全常见问题及解决方法
关于Web安全,我们最早听到最多的就是SQL注入.例如用户在系统登录界面输入用户名和密码,提交以后,后端直接拿到数据就拼接SQL语句去查询数据库.如果在输入时进行了恶意的SQL拼装,那么最后生成的SQ ...
- hashCode equals hashSet
基于hash的map也是这种机制. HashSet import java.util.HashSet; import java.util.Set; import java.util.TreeSet; ...
- 控制数据的小数位数 java / js
//java一般控制格式都是通过 DecimalFormat 来控制的.下边是个例子. import java.text.DecimalFormat; public class ControlBit ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-text-width
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-italic
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- MERGE INTO:存在就更新不存在就新增——oracle
MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your ...
- 前端01 HTML5
01工具使用 Sublime插件安装和使用 2Sublime插件安装和使用.pcf 3Sublime插件安装与卸载.pcf 4Sublime安装markdown插件.pcf 使用typora生成pdf ...
- Linux_Program 前台后台 切换 查看 kill 实用 mark
有时当我们在linux 上 输入 yum repolist 或 curl www.XXX. 时程序由已 :Intel或system 原因 按下 ctrl+z .在Linux终端运行命令的 ...
- spring boot输入数据校验(validation)
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- C#高级编程(第9版) 第11章 LINQ 笔记
概述语言集成查询(Language Integrated Query, LINQ)在C#编程语言中集成了查询语法,可以用相同的语法访问不同的数据源.LINQ提供了不同数据源的抽象层,所以可以使用相同的 ...