您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: