hdu 1520 树形dp入门
2015-07-15 14:05
281 查看
和poj 1463基本一样。
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 6001; int head ; int rating ; bool flag ; int dp [2]; int e, n; void init() { e = 0; memset( flag, true, sizeof(flag) ); memset( head, -1, sizeof(head) ); } struct Edge { int v, next; } edge ; void addEdge( int u, int v ) { edge[e].v = v; edge[e].next = head[u]; head[u] = e++; } void dfs( int u ) { dp[u][0] = 0; dp[u][1] = rating[u]; for ( int i = head[u]; i != -1; i = edge[i].next ) { int v = edge[i].v; dfs(v); dp[u][0] += max( dp[v][0], dp[v][1] ); dp[u][1] += dp[v][0]; } } int main () { while ( scanf("%d", &n) != EOF ) { for ( int i = 1; i <= n; i++ ) { scanf("%d", rating + i); } init(); int v, u; while ( scanf("%d%d", &v, &u) != EOF ) { if ( v == 0 && u == 0 ) break; addEdge( u, v ); flag[v] = false; } int root; for ( int i = 1; i <= n; i++ ) { if ( flag[i] ) { root = i; break; } } dfs(root); int ans = max( dp[root][0], dp[root][1] ); printf("%d\n", ans); } return 0; }
相关文章推荐
- 正则表达式:元字符、限定符、反义代码
- 统计0到n之间1的个数
- leetcode 034 —— Search for a Range
- JAVA学习应该从哪方面着手呢?
- RedHat更新GCC升级4.9.2
- 信息安全专业知识点大提纲
- PC+运动控制卡的控制方案
- Codeforces Round #274(Div2) B. Towers 贪心
- Android SnackBar
- Linux strace命令
- WebLogic之Session
- asp.net如何读写xml文件
- c# 对一下XML文档进行添加删改的实例
- SDWebImage的简单使用
- iOS开发——UI基础-自定义构造方法,layoutSubviews,Xib文件,利用Xib自定义View
- ubuntu/linux mint 创建proc文件的三种方法(两)
- 单例设计模式
- LeetCode - Largest Number (sort的cmp的写法)
- envi 监督分类超详细过程
- Chapter 5. Forms