树形DP hdu1520

 1 #include <iostream>
 2 #include <cstdio>
 3
 4 using namespace std;
 5
 6 struct node
 7 {
 8     int fro,to,next;
 9 }e[36000000];
10 int dp[6000][2];
11 int num=0;
12 int head[6000];
13 int val[6000];
14 bool isye[6000];
15
16 void addEdge(int _fro,int _to)
17 {
18     num++;
19     e[num].fro=_fro;
20     e[num].to=_to;
21     e[num].next=head[_fro];
22     head[_fro]=num;
23 }
24
25 int dfs(int x)
26 {
27     dp[x][0]=0;
28     dp[x][1]=val[x];
29     for(int i=head[x];i!=-1;i=e[i].next)
30     {
31         int v=e[i].to;
32         dfs(v);
33         dp[x][0]+=max(dp[v][0],dp[v][1]);
34         dp[x][1]+=dp[v][0];
35     }
36     return max(dp[x][0],dp[x][1]);
37 }
38
39 int main()
40 {
41     int n;
42     while(scanf("%d",&n)!=EOF)
43     {
44         for(int i=1;i<=n;i++)
45         {
46             scanf("%d",&val[i]);
47         }
48         int a,b;
49         for(int i=0;i<=n;i++)
50         {
51             head[i]=-1;
52             isye[i]=true;
53         }
54         while(scanf("%d%d",&a,&b)!=EOF)
55         {
56             if(a==0&&b==0)
57                 break;
58             addEdge(b,a);
59             isye[a]=false;
60         }
61         for(int i=1;i<=n;i++)
62         {
63             if(isye[i])
64             {
65                 cout<<dfs(i)<<endl;
66             }
67         }
68     }
69     return 0;
70 }

时间: 2024-10-12 03:50:56

树形DP hdu1520的相关文章

hdu1520 第一道树形DP,激动哇咔咔!

A - 树形dp Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure

【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534

[树形dp]就是在树上做的一些dp之类的递推,因为一般需要递归处理,因此平凡情况的处理可能需要理清思路.昨晚开始切了4题,作为入门训练.题目都非常简单,但是似乎做起来都还口以- hdu1520 Anniversary party 给一颗关系树,各点有权值,选一些点出来.任一对直接相连的边连接的点不能同时选择,问选择出的权值和最大为多少. 考虑以u为根的子树可以选择的方法,dp[u]表示选择u时能获得最大收益,dp2[u]表示不选u时能获得的最大收益.则u不选时,为dp2[u]=max{dp[v]

hdu1520 (树形dp)

hdu1520 http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意是给定一棵树,每个结点有一个价值,要我们选择任意个结点使得总价值最大,规则是如果父亲结点被选了,那么儿子结点不可以被选,但是儿子的儿子可以被选 本来学搜索的时候找到这题搜索题,然后用搜索做的 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <algo

hdu1520树形dp入门

题目链接 题意:要开派对,邀请了上司就不能邀请他的下属,邀请了下属就不能邀请他的上司,每个人有一个值,求邀请的人的总值最大 第一行给出一个数n,代表有n个人. 下面n行分别给出n个人的的值 再下面n行每行给出L,K;K是L的上司 以0 0结束一组输入 树形dp:把每个人看成一个点,则该点有两个状态:邀请或没被邀请 定义f[u][0]为节点没被邀请时的值:f[u][1]为节点被邀请时的值 状态转移方程: f[u][0]=sum(max(f[v][0],f[v][1])//v为u的下属 f[u][1

HDU-1520 Anniversary party (树形DP)

Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation forms a tree rooted at the rector V. E.

HDU1520(树形dp)

H - Anniversary party Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical

hdu1520 Anniversary party(最大独立集 树形dp)

题目链接:点击打开链接 题目描述:现有一棵树,树上每个结点都有一个权值,问从中选一些点,这些点两两之间不直接连接,问权值最大为多少? 解题思路:很裸的一道树上最大独立集问题 树形dp即可 dp[i][0]:不选i节点 dp[i][0]+=max(dp[t][0],dp[t][1]); dp[i][1]:选i节点     dp[i][1]+=dp[t][0]; 代码: #pragma comment(linker,"/STACK:1024000000,1024000000") #incl

树形 DP 总结

本文转自:http://blog.csdn.net/angon823/article/details/52334548 介绍 1.什么是树型动态规划 顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺推与逆推,而树型动态规划是建立在树上的,所以也相应的有二个方向: 1.叶->根:在回溯的时候从叶子节点往上更新信息 2.根 - >叶:往往是在从叶往根d

HDU-2196 Computer (树形DP)

最近在看树形DP,这题应该是树形DP的经典题了,写完以后还是有点感觉的.之后看了discuss可以用树分治来做,以后再试一试. 题目大意 找到带权树上离每个点的最远点.︿( ̄︶ ̄)︿ 题解: 对于每一个点的最远点,就是以这个点为根到所有叶子节点的最长距离.但是如果确定根的话,除了根节点外,只能找到每个节点(度数-1)个子树的最大值,剩下一个子树是该节点当前的父亲节点. 所以当前节点的最远点在当前节点子树的所有叶子节点以及父亲节点的最远点上(当父亲节点的最远点不在当前节点的子树上时), 如果父亲节