Anniversary party

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8667    Accepted Submission(s): 3748

Problem Description
There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation forms a tree rooted at the rector V. E. Tretyakov. In order to make the party funny for every one, the rector does not want both an employee and his or her immediate supervisor to be present. The personnel office has evaluated conviviality of each employee, so everyone has some number (rating) attached to him or her. Your task is to make a list of guests with the maximal possible sum of guests' conviviality ratings.
 
Input
Employees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go T lines that describe a supervisor relation tree. Each line of the tree specification has the form:  L K  It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line  0 0
 
Output
Output should contain the maximal sum of guests' ratings.
 
Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
 
Sample Output
5
 
Source
 
题目大意是,有一群人之间有上下级关系,在一个 party 中,有直接的上下级关系(即树中的父子关系)的人不能同时出席,每个人都有个 rating ,闻如何选择出席的人,使得所有人的 rating 之和最大
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf =0x7f7f7f7f;
const double pi=acos(-1);
const int maxn=40000; int n,x,y,a[6005],dp[6005][3],indeg[6005];
vector<int> G[6005];
int solve()
{
int ans=0;
queue<int> q;
for(int i=1;i<=n;i++)
{
ans=max(ans,a[i]);
dp[i][1]=a[i];
dp[i][0]=0;
if(!indeg[i]) {q.push(i);}
}
while(q.size())
{
int u=q.front();q.pop();
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
dp[v][0]+=max(dp[u][0],dp[u][1]);
dp[v][1]+=dp[u][0];
indeg[v]--;
if(!indeg[v]) q.push(v);
ans=max(ans,max(dp[v][0],dp[v][1]));
}
}
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++) {G[i].clear();scanf("%d",&a[i]);}
MM(indeg,0);
for(;;)
{
scanf("%d %d",&x,&y);
if(!x&&!y) break;
G[x].push_back(y);
indeg[y]++;
}
printf("%d\n",solve());
}
return 0;
}

分析:应该是最基础的树形dp吧,按照DAG建好图后,从叶子节点u考虑(其只能为子节点),设

dp[u][0]为不选u节点时所能得到的最大rating

dp[u][1]为选u节点所能得到的最大rating

对于其父节点v构建状态转移方程:

dp[v][0]+=max(dp[u][0],dp[u][1]);(只能选其中一个)

dp[v][1]+=dp[u][0];

最后按照DAG往上扫上去就好

最新文章

  1. jQuery +ajax +json+实现分页
  2. [LeetCode] Implement Queue using Stacks 用栈来实现队列
  3. Linux学习之Exam系统发布
  4. Swift3.0基础语法学习&lt;四&gt;
  5. 绘制复数图形和双y轴图形
  6. Eclipse安装反编译工具JadClipse
  7. Delphi 获取北京时间(通过百度和timedate网站)
  8. 交叉编译和使用HTOP
  9. jQuery中$.extend(true,object1, object2);深拷贝对象
  10. bzoj 1705;poj 3612:[Usaco2007 Nov]Telephone Wire 架设电话线
  11. python整数与IP地址转换
  12. GO语言的包
  13. java之反射的基本介绍
  14. [转]什么是C++虚函数、虚函数的作用和使用方法
  15. 浅析HttpCient
  16. (转)python学习笔记5--decimal
  17. BZOJ 3143 游走(贪心+期望+高斯消元)
  18. Toolbar和Drawerlayout的基本使用
  19. Java学习笔记(13)
  20. jenkins使用HTML Publisher Plugin插件 拉取报告样式缺失问题解决

热门文章

  1. 【案例分享】在 React 框架中使用 SpreadJS 纯前端表格控件
  2. 解决ubuntu命令行中文乱码
  3. Web前端开发HTML基础
  4. redis 学习(5)-- 列表类型
  5. |、&amp;、||、&amp;&amp;、^符号含义
  6. 目录:Matrix Differential Calculus with Applications in Statistics and Econometrics,3rd_[Magnus2019]
  7. Python基础编程:字符编码、数据类型、列表
  8. label smooth
  9. django 自带认证系统(login,logout,authenticate,login_required)
  10. java 集合数组排序