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 }

View Code

但是学树形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 }

View Code

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

转载于:https://www.cnblogs.com/justPassBy/p/4439068.html

hdu1520 (树形dp)相关推荐

  1. 动态规划 —— 树形 DP

    [概述] 树形动态规划是在树的数据结构上的动态规划,在各个阶段呈现树状关系的时候可以采用树形 DP,其基本思想是由子节点的信息推出父节点的信息. 树形 DP 中,是通过以下 4 点树的特点来进行建图的 ...

  2. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  3. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  4. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  5. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  6. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  7. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  8. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  9. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)

    题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...

最新文章

  1. WYSE Thin Clinet 常用快捷键
  2. ajax 传递数组与接收
  3. PMcaff写给大家的年终碎碎念 PMcaff | 记录
  4. wxWidgets:wxStdOutputStreamBuffer类用法
  5. 设计模式 抽象工厂模式(Abstract Factory)
  6. LWIP之IP层实现(转载)
  7. vue设置多选框默认勾选_vue中复选框怎么默认全选,至少选择4个才可以点击下一步...
  8. 数组(array)(小谈)
  9. u-boot移植随笔:使用svn进行版本控制
  10. 服务器网络销售软文,关于云服务器的软文
  11. windows mac linux 木马,针对Linux Windows macOS系统Adwind木马广告攻击
  12. Go语言之进阶篇请求报文格式分析
  13. android ios开发难度对比,ios VS android:这不就是简洁与复杂最明显的对比
  14. UT2012学习笔记
  15. 神经网络模型计算量分析
  16. 对mysql优缺点的思考
  17. OpenHarmony HDF LED驱动开发 基于小熊派Micro
  18. 校招linux面试题,2013华为校招机试与面试题整理
  19. python实现进制转换器_python实现进制转换(二、八、十六进制;十进制)
  20. 我的世界怎么看服务器信息,我的世界怎么查看服务器种子

热门文章

  1. jq使用教程05_ 新手也能用的安装版本,30秒点选即可安装完成,不需配置Python环境
  2. 集团公司(嵌入ETL工具)财务报表系统解决方案
  3. 实验9Linux共享内存通信,操作系统原理与Linux实践教程(卓越工程师培养计划系列教材)...
  4. 音乐计算机官方.,Boom音乐电脑版
  5. hmac sha256 php,PHP中的HMAC-SHA-256
  6. LeetCode:62. 不同路径(python、c++)
  7. 实验4 C++程序的结构(4学时)
  8. P1181 数列分段Section I
  9. 自动驾驶——模型部署的学习笔记
  10. Python——装饰器的学习笔记(legacy)