HDU 1520 Anniversary Party
2016-01-18 19:57
405 查看
题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1520
题解,这是我的备忘录,没有任何注释。
题解,这是我的备忘录,没有任何注释。
#include <iostream> #include <vector> #include <cstring> using namespace std; /* dp[i][1] = max(dp[i parent][0] + score[i]) dp[i][0] = max(dp[i parent][1], dp[i parent][0]) if i 去:则对于其每一个孩子节点j而言,j是不能去的 dp[i][1] = sum(dp[j][0]) + score[i]; else i 不去:则对于其每一个孩子节点j而言,j可以去可以不去,选择快乐值较大的方案 dp[i][0] = sum(max(dp[j][0], dp[j][1])); */ const int MAX_N = 6000; int score[MAX_N + 1]; std::vector< std::vector<int> > graph(MAX_N + 1, std::vector<int>(0, 0)); int parent[MAX_N + 1]; int n; int dp[MAX_N + 1][2]; void treeDP(int node) { dp[node][1] = score[node]; dp[node][0] = 0; for (int i = 0; i < graph[node].size(); ++i) treeDP(graph[node][i]); for (int i = 0; i < graph[node].size(); ++i) { int child = graph[node][i]; dp[node][1] += dp[child][0]; dp[node][0] += max(dp[child][0], dp[child][1]); } } int main(int argc, char const *argv[]) { while (cin >> n) { memset(score, 0, sizeof(int) * (MAX_N + 1)); memset(parent, 0, sizeof(int) * (MAX_N + 1)); memset(dp, 0, sizeof(int) * (MAX_N + 1) * 2); for (int i = 1; i <= n; ++i) { cin >> score[i]; graph[i].clear(); } int l, k; while (true) { cin >> l >> k; if (l == 0 && k == 0) break; else { parent[l] = k; graph[k].push_back(l); } } // find root node int root = 1; while (parent[root] != 0) root = parent[root]; treeDP(root); cout << max(dp[root][0], dp[root][1]) << endl; } return 0; }
相关文章推荐
- Nginx+FastCGI运行原理
- 3.继承
- 理解js原型和原型链
- POJ 3667 :线段树
- 面试基础知识点
- python
- ios 中如何处理于Webview 的交互
- 博弈论入门
- automic包下相关类的介绍
- 遍历进程和模块
- hdu 2842 Chinese Rings(矩阵递推)
- Android 调整工作方式 改善耗电问题 <15>
- STL_算法_删除(remove、remove_if、remove_copy、remove_copy_if)
- VS2012 scanf()运行通不过的时候,提示需要使用scanf_s()的解决办法。
- Python进程和线程
- 【Android源码-PMS】(二)ComponentInfo类
- 路漫漫其修远兮吾将上下而求索
- MFC打开文件对话框
- 【LeetCode OJ 242】Valid Anagram
- UVA-1663 Purifying Machine (最大匹配数)