sgu 195 New Year Bonus Grant 树形dp
来源:互联网 发布:玩具战争防御塔数据 编辑:程序博客网 时间:2024/05/18 03:34
给一棵树,根节点为1,对于根节点以外的每一个节点,可以点亮该节点或他的一个儿子节点。求最多点亮的节点数*1000,以及一种可行的点亮方案。
记dp[i][0]为i不点时,i的子树中点亮的节点数,dp[i][1]为i点亮时,i的子树中点亮的节点数。初始状态除了1意外所有的dp[i][1]都是1,然后从根节点开始dfs,dp[i][1]=dp[i][1]+sum(dp[v][0],g[i][v]==true),记res=sum(dp[v][0],g[i][v]==true),dp[i][0]=max(res-dp[v][0]+dp[v][1],g[i][v])。方案的话另开一个bool数组,更新Dp[i][0]的时候记录一下他的子节点的1,0情况就可以。
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <queue>#include <stack>#include <algorithm>#include <vector>using namespace std;typedef long long ll;int n,m;const int maxn=500000+500;int dp[maxn][2];bool ok[maxn];vector<int> g[maxn];void dfs(int i){ int res=0; for (int j=0; j<g[i].size(); j++) { int v=g[i][j]; dfs(v); res+=dp[v][0]; } dp[i][1]+=res; int ans=res; int k=-1; for (int j=0; j<g[i].size(); j++) { int v=g[i][j]; if (ans<res-dp[v][0]+dp[v][1]) { k=v; ans=res-dp[v][0]+dp[v][1]; } } dp[i][0]=ans; if (k!=-1) ok[k]=true;}int main(){// freopen("in.txt","r",stdin); scanf("%d",&n); memset(dp,0,sizeof dp); for (int i=1; i<=n; i++) dp[i][1]=1,g[i].clear(); for (int i=2; i<=n; i++) { scanf("%d",&m); g[m].push_back(i); } memset(ok,0,sizeof ok); dfs(1); cout<<dp[1][0]*1000<<endl; for (int i=1; i<=n; i++) if (ok[i]) cout<<i<<" "; cout<<endl; return 0;}
- SGU 195 New Year Bonus Grant(树形dp)
- sgu 195 New Year Bonus Grant 树形dp
- sgu195:New Year Bonus Grant(树形dp)
- sgu 195 New Year Bonus Grant【简单贪心】
- 1212 New Year Bonus Grant
- New Year Bonus Grant(SGU195,贪心or区间DP)
- [Virtual Judge]SGU195:New Year Bonus Grant
- ZOJ 2315 New Year Bonus Grant
- ZOJ - 2315 New Year Bonus Grant
- SGU195--New Year Bonus Grant (贪心)
- ZOJ2315 New Year Bonus Grant(贪心)
- zoj 2315 New Year Bonus Grant
- New Year Bonus Grant(简单贪心(模拟树形结构))
- ACDREAM 03B New Year Bonus Grant(贪心专场)
- ZOJ 2315 New Year Bonus Grant(贪心)
- ACdream oj 1212 New Year Bonus Grant(贪心+拓扑排序)
- SGU 195 树形DP
- New Year Santa Network - CodeForces 500 D 树形dp
- Linux网络编程--TCP的套接字通信学习笔记
- 冒个泡
- sgu 525 Revolutionary Roads
- Android am命令
- 持续集成与测试自动化
- sgu 195 New Year Bonus Grant 树形dp
- UITableView
- 手把手教你mysql(十)索引
- Java 单例的两种方法示例
- 俞敏洪:笨有笨的好处
- memset原理(为什么只能初始化成0或者-1)
- 十四周——选择排序
- 【数组】14周项目六(三)。去除str1中的空格,仍保存在str1中(贺while版)
- 男人身上必须有的15种修养,让你乘风破浪!