POJ 2342 - Anniversary party (树形dp)
2016-07-21 21:33
344 查看
题目链接:
http://poj.org/problem?id=2342题解:
dp[i][0]表示第i个人不去所获得的最大价值,dp[i][1]表示第i个人去所获得的最大价值。状态转移方程为:
dp[boss][1] += dp[employee][0];
dp[boss][0] += max(dp[employee][0],dp[employee][1]);
用dfs搜一下就好了。
AC代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int dp[6050][2],bos[6040],visit[6050]; int N,boss; void dfs(int node) { for(int i = 1; i <= N; i ++) { if(bos[i] == node) { dfs(i); dp[node][1] += dp[i][0]; dp[node][0] += max(dp[i][0], dp[i][1]); } } } int main() { cin >> N; for(int i = 1; i <= N; i++) { int value; cin >> value; dp[i][1] = value; } int l,k; while(cin >> l >> k) { if(l == 0 && k == 0)break; bos[l] = k; boss = k; } dfs(boss); cout << max(dp[boss][0],dp[boss][1]) << endl;; return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002