hdu1520 (树形dp)
hdu1520 http://acm.hdu.edu.cn/showproblem.php?pid=1520
题意是给定一棵树,每个结点有一个价值,要我们选择任意个结点使得总价值最大,规则是如果父亲结点被选了,那么儿子结点不可以被选,但是儿子的儿子可以被选
本来学搜索的时候找到这题搜索题,然后用搜索做的
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
typedef long long LL;
const int INF = <<;
int val[];
int f[];
vector<int> g[];
int dfs(int u, bool flag)//flag标记父亲结点是不是取
{
int t,t2;
if(!flag)
t = val[u];
t2 = ;
for(int i=; i<g[u].size(); ++i)
{
int v = g[u][i];
if(!flag)
{
t += dfs(v,true);
}
t2 += dfs(v,false);
}
if(flag)
return t2;
return max(t,t2);
}
int main()
{
int n,i,x,y;
while(scanf("%d",&n)!=EOF)
{ for(i=; i<=n; ++i)
{
g[i].clear();
scanf("%d",&val[i]);
f[i] = -;
}
while(scanf("%d%d",&x,&y),x)
{
g[y].push_back(x);
f[x] = y;
}
x = ;
while(f[x]!=-)
x = f[x];
printf("%d\n",dfs(x,false));
}
return ;
}
但是学树形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]) );
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
typedef long long LL;
const int INF = <<;
const int N = + ;
int val[N];
int dp[N][];//dp[u][1]表示选这个结点的最大值, dp[u][0] 表示不选这个结点的最大值
struct Edge
{
int v,next;
}g[N<<];
int head[N],e; void dfs(int u, int fa)
{
dp[u][] = val[u];
dp[u][] = ;
for(int i=head[u]; i!=-; i=g[i].next)
{
int v = g[i].v;
if(v==fa) continue;
dfs(v,u);
dp[u][] = max(dp[u][],dp[u][]+dp[v][]);
dp[u][] = max(dp[u][],max(dp[u][]+dp[v][],dp[u][]+dp[v][] )); //dp[u][1] += dp[v][0];
//dp[u][0] += dp[v][1];
}
}
void init(int n)
{
for(int i=; i<=n; ++i)
head[i] = -;
e = ;
}
void addEdge(int u, int v)
{
g[e].v = v;
g[e].next = head[u];
head[u] = e++;
} int main()
{
int n,i,a,b;
while(scanf("%d",&n)!=EOF)
{
init(n);
for(i=; i<=n; ++i)
scanf("%d",&val[i]);
while(scanf("%d%d",&a,&b),a)
{
addEdge(a,b);
addEdge(b,a);
//g[a].push_back(b);
//g[b].push_back(a);
}
dfs(,-);
printf("%d\n",max(dp[][],dp[][]));
}
return ;
}
最近老发现用vector建图提交老师runtime error,
hdu1520 (树形dp)的更多相关文章
- hdu1520 树形dp
树形dp入门,在树上进行dp. 状态转移方程: dp[i][0] = max(dp[j][0], dp[j][1]);//i为j的上司 并且i不来 dp[i][1] = dp[j][0];//i来了 ...
- HDU1520 树形DP入门
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu1520树形dp入门
题目链接 题意:要开派对,邀请了上司就不能邀请他的下属,邀请了下属就不能邀请他的上司,每个人有一个值,求邀请的人的总值最大 第一行给出一个数n,代表有n个人. 下面n行分别给出n个人的的值 再下面n行 ...
- hdu1520 树形dp Anniversary party
A - Anniversary party Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- hdu1520树形dp第一题
判断最大的欢喜值,如果上司来了,直系下属就不来 如果子节点j不来那么dp[i][1]+=dp[j][0];如果子节点j来那么dp[i][0]+=max(dp[j][0],dp[j][1]);//因为j ...
- hdu1520 第一道树形DP,激动哇咔咔!
A - 树形dp Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- 【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534
[树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 An ...
- hdu1520 Anniversary party 简单树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 思路:树形DP的入门题 定义dp[root][1]表示以root为根节点的子树,且root本身参 ...
- HDU1520:Anniversary party(树形dp第一发)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1520 一个公司去参加宴会,要求去的人不能有直接领导关系,给出每一个人的欢乐值,和L K代表K是L的直接领导 ...
随机推荐
- <ctype.h> C语言标准库
ctype.h是C标准函数库中的头文件,定义了一批C语言字符分类函数(C character classification functions),用于測试字符是否属于特定的字符类别.如字母字符.控制字 ...
- IT痴汉的工作现状18-思维定式
前阵子周权出差给我带回来一个净水器,是直接安装在水龙头上的,小巧方便.我依照安装说明一步一步组装好了,感觉说明书还是比較靠谱的,没有遇到意外.但我发现它的净水.原水的button好像是有问题.它的结构 ...
- Codeforces 475D CGCDSSQ 求序列中连续数字的GCD=K的对数
题目链接:点击打开链接 #include <cstdio> #include <cstring> #include <algorithm> #include < ...
- 五、Linux/UNIX操作命令积累【cp、mv、cat、grep、ps】
在使用Linux/UNIX下,常常会使用文本界面去设置系统或操作系统,作者本人在工作的过程也在不断接触这方面的命令,所以为此特酝酿.准备.開始了本文的编写.本文主要记录自己平时遇到的一些Linux/U ...
- Spark中的Scheduler
Spark中的Scheduler scheduler分成两个类型.一个是TaskScheduler与事实上现,一个是DAGScheduler. TaskScheduler:主要负责各stage中传入的 ...
- virus.win32.parite.H病毒的查杀方法
virus.win32.parite.H病毒的查杀方法 昨天电脑中了virus.win32.parite.H病毒,搞了2个多小时最终搞定了.以下记录下我的解决方法. 第一步:下载Win32.Parit ...
- Theano+Keras+CUDA7.5+VS2013+Windows10x64配置
Visual Studio 2013 正常安装,这里只要C++打勾就可以. ANACONDA ANACONDA是封装了Python的科学计算工具,装这个就可以不用额外装Python了.在安装之前建议先 ...
- Java程序员须知的七个日志管理工具(转)
Splunk vs. Sumo Logic vs. LogStash vs. GrayLog vs. Loggly vs. PaperTrails vs. Splunk>Storm 英文原文:T ...
- Linux下一个简单的日志系统的设计及其C代码实现
1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...
- 零基Android手机嵌入式开发培训课程
亲爱的朋友,我这里有一组当然想和大家分享,假设有兴趣在这个过程中,可以加我QQ2059055336和我联系. 课程章节分布: 第一部分 嵌入式C与数据结构篇 (20讲) 第二部分ARM裸机开发篇 (4 ...