树形dp回顾Anniversary party
来源:互联网 发布:轩辕剑坐骑10进阶数据 编辑:程序博客网 时间:2024/06/01 09:55
这道题真的是已经被用烂了。
一个是最大人数是多少,一个是最大的happy值是多少,都是大同小异的。
从树根开始dfs做dp
如果这个人是来的
那么dp[root][1]先初始化,继续向下做dp。
然后最后的状态方程式
dp[root][0]+=max(dp[child][0],dp[child][1]);
dp[root][1]+=dp[child][0];
#include<bits/stdc++.h>using namespace std;const int maxn = 6005;vector<int>v[maxn];int indegree[maxn],vis[maxn],dp[maxn][2],happy[maxn];int n,a,b;int findroot(){ for(int i=0; i<=maxn; i++) { if(vis[i]&&indegree[i]==0) return i; }}void dfs(int root)//dp{ dp[root][1]=happy[root]; for(int i=0; i<v[root].size(); i++) dfs(v[root][i]); for(int i=0; i<v[root].size(); i++) { dp[root][0]+=max(dp[v[root][i]][0],dp[v[root][i]][1]); dp[root][1]+=dp[v[root][i]][0]; }}int main(){ while(cin>>n) { memset(indegree,0,sizeof(indegree)); memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) { cin>>happy[i]; v[i].clear(); } while(cin>>a>>b,a||b) { v[b].push_back(a); vis[a]=1; vis[b]=1; indegree[a]++; } int root = findroot();//find the root dfs(root); //cout<<root<<endl; cout<<max(dp[root][0],dp[root][1])<<endl; } return 0;}
0 0
- 树形dp回顾Anniversary party
- 【树形DP】Anniversary party
- 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)
- poj2342 Anniversary party【树形dp】
- Anniversary party(树形DP)
- poj Anniversary party (树形DP)
- POJ2342 Anniversary party(树形DP)
- poj2342.Anniversary party(树形dp)
- hdu1520 Anniversary party 【树形dp】
- C
- 连接和断开扫描枪时,屏幕都会刷新,造成临时加载的数据丢失
- Tomcat
- 说说 Google 软件测试开发工程师的工作内容
- 功能测试用例的设计方法与执行测试
- 树形dp回顾Anniversary party
- spring mvc详解
- JavaScript 自制模态对话框
- HDU 1166 敌兵布阵 【简单的树状数组||线段树】
- vim基础入门
- CSDN博客页面自定义左侧博客栏目
- 一步一步写web之初识web(三)
- 算法25:实现String类的构造函数,拷贝构造函数和赋值函数
- Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法