[POJ2342]Anniversary party(树dp)
2016-08-27 15:39
369 查看
题目链接:http://poj.org/problem?id=2342
题意:n个人每个人有一个conviviality ratings,而且任何人之间是从属的关系。有一个活动,组织者希望来参加的人互相之间没有直接的从属关系,问最大conviviality ratings总和。
以1节点开始dfs,每次遍历时根据当前点来或者不来做决策,如果当前节点来,则它的儿子不来,否则两个都要遍历,取最大值。用dp(i,j)数组存状态,i表示编号j表示来(1)或者不来(0),dp(i,0)+=max(dfs(i's son, 0), dfs(i's son, 1)) dp(i,1)+=dfs(i's son, 0)
题意:n个人每个人有一个conviviality ratings,而且任何人之间是从属的关系。有一个活动,组织者希望来参加的人互相之间没有直接的从属关系,问最大conviviality ratings总和。
以1节点开始dfs,每次遍历时根据当前点来或者不来做决策,如果当前节点来,则它的儿子不来,否则两个都要遍历,取最大值。用dp(i,j)数组存状态,i表示编号j表示来(1)或者不来(0),dp(i,0)+=max(dfs(i's son, 0), dfs(i's son, 1)) dp(i,1)+=dfs(i's son, 0)
/* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mind! ┛┗┛┗┛┃\○/ ┓┏┓┏┓┃ / ┛┗┛┗┛┃ノ) ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┃┃┃┃┃┃ ┻┻┻┻┻┻ */ #include <algorithm> #include <iostream> #include <iomanip> #include <cstring> #include <climits> #include <complex> #include <fstream> #include <cassert> #include <cstdio> #include <bitset> #include <vector> #include <deque> #include <queue> #include <stack> #include <ctime> #include <set> #include <map> #include <cmath> using namespace std; #define fr first #define sc second #define cl clear #define BUG puts("here!!!") #define W(a) while(a--) #define pb(a) push_back(a) #define Rint(a) scanf("%d", &a) #define Rs(a) scanf("%s", a) #define Cin(a) cin >> a #define FRead() freopen("in", "r", stdin) #define FWrite() freopen("out", "w", stdout) #define Rep(i, len) for(int i = 0; i < (len); i++) #define For(i, a, len) for(int i = (a); i < (len); i++) #define Cls(a) memset((a), 0, sizeof(a)) #define Clr(a, x) memset((a), (x), sizeof(a)) #define Full(a) memset((a), 0x7f7f7f, sizeof(a)) #define lrt rt << 1 #define rrt rt << 1 | 1 #define pi 3.14159265359 #define RT return #define lowbit(x) x & (-x) #define onecnt(x) __builtin_popcount(x) typedef long long LL; typedef long double LD; typedef unsigned long long ULL; typedef pair<int, int> pii; typedef pair<string, int> psi; typedef pair<LL, LL> pll; typedef map<string, int> msi; typedef vector<int> vi; typedef vector<LL> vl; typedef vector<vl> vvl; typedef vector<bool> vb; const int maxn = 6060; vector<int> G[maxn]; int dp[maxn][2]; int w[maxn]; int n; int dfs(int p, int u, int s) { if(dp[u][s] != -1) return dp[u][s]; int v; if(s) { dp[u][s] = w[u]; Rep(i, G[u].size()) { v = G[u][i]; if(v == p) continue; dp[u][s] += dfs(u, v, 0); } } else { dp[u][s] = 0; Rep(i, G[u].size()) { v = G[u][i]; if(v == p) continue; dp[u][s] += max(dfs(u, v, 0), dfs(u, v, 1)); } } return dp[u][s]; } int main() { // FRead(); int u, v; while(~Rint(n)) { Rep(i, n+5) G[i].clear(); Clr(dp, -1); For(i, 1, n+1) Rint(w[i]); while(~Rint(u) && ~Rint(v) && u + v) { G[u].pb(v); G[v].pb(u); } int ret = max(dfs(0, 1, 0), dfs(0, 1, 1)); printf("%d\n", ret); } RT 0; }
相关文章推荐
- POJ 2286 The Rotation Game(IDA*)
- Boost::filesystem 使用小笔记
- awk的模式和动作
- python模块和包
- 给即将大三的自己一封信
- macosx 交叉编译 valgrind For Android
- 一个精简的实现RecyclerView可添加header和footer的Demo
- 387. First Unique Character in a String
- 细说JVM系列:虚拟机类加载机制
- codeforces 708B-Recover the String
- Linux驱动开发环境配置(内核源码树构造)
- STM32--CAN简单接收和发送
- linux缓冲区解析
- CentOS 6.5/6.6 安装mysql 5.7 最完整版教程
- 考勤信息(员工打卡)
- 自定义ViewPager设置是否可滑动
- struts.xml配置
- 旋转(Rotation)手势
- JS精确计算bug
- Builder模式