POJ2342_Anniversary party 树形DP
来源:互联网 发布:英语句子语法分析软件 编辑:程序博客网 时间:2024/05/16 10:42
题意: 给定一个n, 对于每个人有一个权重,然后给定一个上下级关系,上级来了直属下级不能取,最后问最大权重值。
做法: 树形DP,先确定根节点,然后在通过转移方程
dp[root][1]+=dp[son][0];
dp[root][0]+=max(dp[son][0],dp[son][1]); 确定
AC 代码:
#include<iostream>#include<vector>#include<cstring>using namespace std;int p[6001];int dp[6001][2];vector<int>edge[6011];int num[6011];int father[6011];int work(int root){ dp[root][0]=0;dp[root][1]=p[root]; for(int i=0;i<num[root];i++) { int temp=edge[root][i]; //cout<<temp<<endl; work(temp); dp[root][1]+=dp[temp][0]; dp[root][0]+=max(dp[temp][0],dp[temp][1]); } return max(dp[root][0],dp[root][1]);}int main(){ int n; cin>>n; memset(p,0,sizeof(p)); memset(dp,0,sizeof(dp)); memset(num,0,sizeof(num)); memset(father,0,sizeof(father)); for(int i=1;i<=n;i++) cin>>p[i]; int a,b; while(cin>>a>>b) { if(a==0&&b==0)break; else { edge[b].push_back(a); father[a]=1; num[b]++; } } int root; for(int i=1;i<=n;i++){if(father[i]==0) root=i;} // cout<<"root is "<<root<<endl; int Max=work(root); cout<<Max<<endl;}
- POJ2342_Anniversary party 树形DP
- 【树形DP】Anniversary party
- hdu1520Anniversary party (树形DP)
- POJ2342Anniversary party(树形dp)
- Anniversary party--树形DP
- Anniversary Party(树形dp)
- 树形dp--Anniversary party
- 树形DP- Anniversary party
- hdu1520 Anniversary party 树形dp
- POJ2342:Anniversary party(树形DP)
- HDU1520:Anniversary party(树形DP)
- Anniversary party(树形dp)
- hdu1520 Anniversary party(树形DP)
- hdu1520 Anniversary party (树形dp)
- hdu1520Anniversary party 树形dp水题
- poj2342 Anniversary party【树形dp】
- Anniversary party(树形DP)
- poj Anniversary party (树形DP)
- 题目1531:货币面值(网易游戏2013年校园招聘笔试题)
- ANGSTROM
- oracle 之flashback 深入研究。
- Java中的final关键字
- WinCE MUI的实现----本人亲自实践
- POJ2342_Anniversary party 树形DP
- 二叉树遍历:已知前序和中序,求后序
- PostgreSQL与MySQL比较
- android textview和edittext中插入表情
- 机器学习_算法_HMM
- Nginx负载均衡简易方法
- ubuntu下QT连接各种数据库报错解决(QSqlDatabase: * driver not loaded)
- Unix学习笔记(2)
- 初始化编译环境 下载源代码