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 <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 typedef long long LL;
15 const int INF = 1<<30;
16 int val[6666];
17 int f[6666];
18 vector<int> g[6666];
19 int dfs(int u, bool flag)//flag标记父亲结点是不是取
20 {
21     int t,t2;
22     if(!flag)
23         t = val[u];
24     t2 = 0;
25     for(int i=0; i<g[u].size(); ++i)
26     {
27         int v = g[u][i];
28         if(!flag)
29         {
30             t += dfs(v,true);
31         }
32         t2 += dfs(v,false);
33     }
34     if(flag)
35         return t2;
36     return max(t,t2);
37 }
38 int main()
39 {
40     int n,i,x,y;
41     while(scanf("%d",&n)!=EOF)
42     {
43
44         for(i=1; i<=n; ++i)
45         {
46             g[i].clear();
47             scanf("%d",&val[i]);
48             f[i] = -1;
49         }
50         while(scanf("%d%d",&x,&y),x)
51         {
52             g[y].push_back(x);
53             f[x] = y;
54         }
55         x = 1;
56         while(f[x]!=-1)
57             x = f[x];
58         printf("%d\n",dfs(x,false));
59     }
60     return 0;
61 }

但是学树形dp的时候又找到这道题,然后用树形dp重新做了一次,提高上去,运行的时间变少了

dp[u][1] 表示选择结点u可以获得的最大价值

dp[u][0]表示不选择结点u可以获得的最大价值

状态转移方程是 dp[u][1] = max( dp[u][1], dp[u][1]+dp[v][0] ); dp[u][0] = max( dp[u][0],max(dp[u][0]+dp[v][1], dp[u][0]+dp[v][0]) );

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 typedef long long LL;
15 const int INF = 1<<30;
16 const int N = 6000 + 10;
17 int val[N];
18 int dp[N][2];//dp[u][1]表示选这个结点的最大值, dp[u][0] 表示不选这个结点的最大值
19 struct Edge
20 {
21     int v,next;
22 }g[N<<1];
23 int head[N],e;
24
25 void dfs(int u, int fa)
26 {
27     dp[u][1] = val[u];
28     dp[u][0] = 0;
29     for(int i=head[u]; i!=-1; i=g[i].next)
30     {
31         int v = g[i].v;
32         if(v==fa) continue;
33         dfs(v,u);
34         dp[u][1] = max(dp[u][1],dp[u][1]+dp[v][0]);
35         dp[u][0] = max(dp[u][0],max(dp[u][0]+dp[v][1],dp[u][0]+dp[v][0] ));
36
37         //dp[u][1] += dp[v][0];
38         //dp[u][0] += dp[v][1];
39     }
40 }
41 void init(int n)
42 {
43     for(int i=1; i<=n; ++i)
44         head[i] = -1;
45     e = 0;
46 }
47 void addEdge(int u, int v)
48 {
49     g[e].v = v;
50     g[e].next = head[u];
51     head[u] = e++;
52 }
53
54 int main()
55 {
56     int n,i,a,b;
57     while(scanf("%d",&n)!=EOF)
58     {
59         init(n);
60         for(i=1; i<=n; ++i)
61             scanf("%d",&val[i]);
62         while(scanf("%d%d",&a,&b),a)
63         {
64             addEdge(a,b);
65             addEdge(b,a);
66             //g[a].push_back(b);
67             //g[b].push_back(a);
68         }
69         dfs(1,-1);
70         printf("%d\n",max(dp[1][0],dp[1][1]));
71     }
72     return 0;
73 }

最近老发现用vector建图提交老师runtime error,

时间: 2024-10-12 12:26:45

hdu1520 (树形dp)的相关文章

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

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——树形DP——Anniversary party

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.

HDU-1520 树形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第一题

判断最大的欢喜值,如果上司来了,直系下属就不来 如果子节点j不来那么dp[i][1]+=dp[j][0];如果子节点j来那么dp[i][0]+=max(dp[j][0],dp[j][1]);//因为j不来i也可以不来 递归的求子节点值 #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include

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]

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 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