hdu1520Anniversary party(树形dp)
src: http://acm.hdu.edu.cn/showproblem.php?pid=1520
ac代码:
#include <iostream> #include<cstdlib> #include<algorithm> #include<cmath> #include<functional> #include<utility> #include<string> #include<string.h> #include<vector> #include<iomanip> #include<stack> using namespace std; #define FOR(i,a,b) for(int i=a;i<=b;i++) const int inf=99999999; int n,v[6005],dp[6005][2],in[6005]; vector<int>head[6005]; void add_edge(int u,int v){head[u].push_back(v);} void dfs(int u) { dp[u][0]=0;dp[u][1]=v[u]; for(int i=0;i<head[u].size();i++){ int v=head[u][i]; dfs(v); dp[u][1]+=dp[v][0]; dp[u][0]+=max(dp[v][0],dp[v][1]); } return; } int main() { std::ios::sync_with_stdio(false); while(cin>>n&&n){ memset(in,0,sizeof(in)); memset(dp,0,sizeof(dp)); FOR(i,1,n)head[i].clear(); int b,d,rt; FOR(i,1,n)cin>>v[i]; FOR(i,1,n){dp[i][0]=0;dp[i][1]=v[i];} while(cin>>b>>d&&b+d){ add_edge(d,b); in[b]++; } FOR(i,1,n)if(in[i]==0){rt=i;dfs(i);break;} cout<<max(dp[rt][0],dp[rt][1])<<endl; } return 0; }

浙公网安备 33010602011771号