HDU 1520 && POJ 2342 Anniversary party
2016-01-10 21:17
302 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1520http://poj.org/problem?id=2342
题意:
给出一个公司的上下级关系,有一个聚会,有直接上下级关系的人不能同时去,每个人去都有一个value求让其中一些人去时取得的最大value值。思路:
简单树形dp,从叶子节点开始向上dp就行了。dp[i][0]表示不取i点能够取得的最大值,dp[i][1]表示取i点时能够取得的最大值。dp[i][0]=i的全部节点取或不取的最大值的和,dp[i][1]=i的全部节点不取时的值之和。
代码:
#define INF 0x3f3f3f3f #define N 11234 int n,m; int f [2],a ,b ; char s[101]; vector<int>v ; void dfs(int now) { f[now][0]=0,f[now][1]=a[now]; for(int i=0;i<v[now].size();i++) dfs(v[now][i]); for(int i=0;i<v[now].size();i++) f[now][0]+=max(f[v[now][i]][0],f[v[now][i]][1]),f[now][1]+=f[v[now][i]][0]; } int main() { int i,j,k,kk,cas,T,t,x,y,z; while(scanf("%d",&n)!=EOF&&n) { for(i=0;i<=n;i++) v[i].clear(); for(i=0;i<=n;i++) f[i][0]=f[i][1]=b[i]=0; for(i=1;i<=n;i++) scanf("%d",&a[i]); while(scanf("%d%d",&y,&x)&&(x||y)) { v[x].push_back(y); b[y]=1; } int res=0; for(i=1;i<=n;i++) if(b[i]==0) { dfs(i); res+=max(f[i][0],f[i][1]); } printf("%d\n",res); } return 0; }
相关文章推荐
- jquery在ie7下选择器的问题导致append失效的解决方法
- Java详解之——JVM内存管理
- grails环境安装包免费共享
- Android 小方法
- IOS7使用原生API进行二维码和条形码的扫描
- dns服务bind使用
- CodeForces 611E New Year and Three Musketeers
- android无限轮播banner图片--viewpager
- 【杭电oj】1084 - What Is Your Grade?(排序,迷之WA)
- hadoop开发—Java零基础,开发选择什么开发工具比较合适
- 关于PATH_INFO SCRIPT_NAME SCRIPT_FILENAME REDIRECT_URL 详解
- IIS
- BZOJ 2219: 数论之神
- 【2-5】RPC——不同进程之间的方法调用
- 外键
- Java 异常处理
- Oracle sql 性能优化
- A Simple Problem with Integers
- 第1章第2节练习题2 非递归删除指定元素
- WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变