poj 2342 Anniversary party 树形dp入门

来源:互联网 发布:python 变量写入txt 编辑:程序博客网 时间:2024/05/16 15:21

点击打开链接

#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int M =6100;int dp[M][2]; //dp[i][0] i不去 = sigma累加 max(dp[j][0],dp[j][1]) j为i的子节点 // dp[i][1] i去 = sigma 累加 dp[j][0] int n,rat[M],fa[M],visit[M],leaf[M],rt;//rt为root void dfs(int node){visit[node]=1;if(leaf[node]) // 叶节点 {dp[node][1]=rat[node];dp[node][0]=0;return;}for(int i=1;i<=n;i++){if(!visit[i]&&fa[i]==node) {dfs(i);dp[node][0]+=max(dp[i][1],dp[i][0]);//node不去,取i去或不去的最大值dp[node][1]+=dp[i][0];}}}int main(){cin>>n;memset(dp,0,sizeof(dp));memset(visit,0,sizeof(visit));for(int i=1;i<=n;i++){cin>>rat[i];leaf[i]=1;//leaf[i]节点i是否为叶节点fa[i]=i; dp[i][1]=rat[i];//初始化 dp[i][1] 并不是最终的dp[i][1] }int x,y;while(cin>>x>>y&&(x+y)){fa[x]=y;//树 :rt除外每个节点只有一个直接先驱 leaf[y]=0;}rt=1; while(fa[rt]!=rt)//找到root  { rt=fa[rt];} dfs(rt);int ans=max(dp[rt][0],dp[rt][1]);cout<<ans<<endl;return 0;}


0 0
原创粉丝点击