题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520

题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为多少

解题思路:简单的树形DP

用dp[i][0]表示以i为根的树上不取i的状态下能得到的最大值

用dp[i][1]表示以i为根的树取i的状态下能得到的最大值

状态转移方程

dp[i][0]=∑(max(dp[son(i)][0],dp[son(i)][1]))

dp[i][1]=∑(dp[son(i)][0])+value[i]

代码如下:

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,102400000")
#define FFF 6005
int value[];
int dp[FFF][];
//dp[i][1]表示取i的最大值,dp[i][0]表示不取i的最大值
int v[FFF*],first[FFF],next[FFF*],e;
bool vis[FFF];
void link(int x,int y)
{
v[e]=y;
next[e]=first[x];
first[x]=e++;
}
int dfs(int now)
{
int ans1=,ans0=;
//ans1 取now的值 ans0 不取now的值
int k,va;
for(k=first[now];k!=-;k=next[k])
{
va=v[k];
if(!vis[va])
{
vis[va]=true;
dfs(va);
ans1+=dp[va][];
ans0+=max(dp[va][],dp[va][]);
}
}
dp[now][]=ans0;
dp[now][]=ans1+value[now];
return max(dp[now][],dp[now][]);
}
int main()
{
int n;
while(~scanf("%d",&n)){
for(int i=;i<=n;i++)
{
dp[i][]=dp[i][]=;
scanf("%d",&value[i]);
first[i]=-;
}
int x,y;
e=;
while(scanf("%d%d",&x,&y),x||y)
{
link(x,y);
link(y,x);
}
memset(vis,false,sizeof(vis));
vis[]=true;
cout<<dfs()<<endl;
}
return ;
}

HDU 1520 Anniversary party [树形DP]的更多相关文章

  1. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  2. hdu oj 1520 Anniversary party(树形dp入门)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划)

    POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划) Descri ...

  4. poj 2324 Anniversary party(树形DP)

    /*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ...

  5. HDU 1520.Anniversary party 基础的树形dp

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. hdu 1520 Anniversary party(第一道树形dp)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  7. HDU 1520 Anniversary party(DFS或树形DP)

    Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...

  8. TTTTTTTTTTT hdu 1520 Anniversary party 生日party 树形dp第一题

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. hdu Anniversary party 树形DP,点带有值。求MAX

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. c语言_链表实例讲解(两个经典例子)

    建立一个学生成绩的线性链表,对其实现插入,删除,输出,最后销毁. demo1 // lianbiao.cpp : Defines the entry point for the console app ...

  2. JAVA 函数式接口与c#委托对应关系(一)

    C# Action委托 VS JAVA Action 接口函数 1.c#:Action 封装一个方法,该方法不具有参数并且不返回值. 构造实体类类 using System; namespace Ac ...

  3. C#有关 字符串方法的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  4. 学习protobuf

    一.认识Protobuf ref:http://blog.csdn.net/program_think/article/details/4229773摘要:1. protobuf是一个开源项目.2. ...

  5. 桂电在线-php-提取菜单到配置文件2

    继续昨晚没完成的主菜单模板: <!-- 菜单块 --> <div class="on-light" id="menus"> <?p ...

  6. 学渣也要搞 laravel(3)—— HTTP控制器

    1. laravel 控制器在app/Http/Controllers/ 下,你会看到里面有一个Controller.php ,之后我们创建的控制器都是继承这个总控制器的.创建控制器只需要在这里面添加 ...

  7. linux shell获取时间

    获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使用 ...

  8. python【第十五篇】JavaScript

    大纲 1 简介 2 存在形式 3 放置位置 4 变量 5 注释 6 数据类型 7 时间处理 8 语句和异常 9 函数及其作用域 1.JS简介 JavaScript是世界上最流行的脚本语言,因为你在电脑 ...

  9. 检测目标程序ELF bit是32还是64

    android操作系统在5.0之后加入了对64位程序的支持,同时兼容运行32位的进程 android的进程绝大部分是zygote父进程fork出来的子进程 zygote进程fork出来的进程是32位进 ...

  10. 写个自动下载安装Ant的shell脚本【一】

    #!/bin/bash ###################################################### # file name: install_ant.sh # # f ...