HDU 1520 Anniversary party-----树形DP

来源:互联网 发布:公司网络环境搭建 编辑:程序博客网 时间:2024/04/27 13:24

dp[i][0]表示  i点 不取

dp[i][1]表示  i点取

j为i的子节点

则  dp[i][0] += max(dp[j][0],dp[j][1]);

      dp[i][1] += dp[j][0];

(j 子节点有很多)

如果 a 为根节点,结果就是 max(dp[a][0],dp[a][1]);  

用 vector 写得邻接表。。


#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<vector>using namespace std;vector<int> adj[6050];int h[6001],dp[6001][2],f[6050];void dfs(int p){dp[p][1]=h[p];int len=adj[p].size();for(int i=0;i<len;i++){dfs(adj[p][i]);}for(int i=0;i<len;i++){dp[p][0]+=max(dp[adj[p][i]][0],dp[adj[p][i]][1]);//重要!!dp[p][1]+=dp[adj[p][i]][0];}}int main(){int n;while(scanf("%d",&n)!=EOF){int i,j,k;for(i=1;i<=n;i++){scanf("%d",&h[i]);f[i]=-1;adj[i].clear();dp[i][0]=0;dp[i][1]=0;}int a,b;while(scanf("%d%d",&a,&b),a||b){f[a]=b;adj[b].push_back(a);}a=1;while(f[a]!=-1) a=f[a];dfs(a);printf("%d\n",max(dp[a][0],dp[a][1]));}}


原创粉丝点击