1. 程式人生 > >hdu 1520(樹形dp)

hdu 1520(樹形dp)

break sin clu sca str sizeof class vector space

剛開始學,自己不服氣看了看書就寫,寫了1個小時沒解決,還是看了題解......dp[v][0]表示這個人沒來,dp[v][1]表示這個人來了

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int n;
const int maxn=6000+10;
int val[maxn];
vector<int> g[maxn];
int dp[maxn][5
]; int md[maxn]; void dfs(int x) { dp[x][0]=0; dp[x][1]=val[x]; for(int i=0;i<g[x].size();i++) { int u=g[x][i]; dfs(u); dp[x][0]+=max(dp[u][0],dp[u][1]);//老板不來,員工可以來,也可以不來 dp[x][1]+=dp[u][0];//老板來了,員工不能來 } } int main() {
while(~scanf("%d",&n)) { memset(dp,0,sizeof(dp)); memset(md,0,sizeof(md)); for(int i=1;i<=n;i++) g[i].clear(); for(int i=1;i<=n;i++) scanf("%d",&val[i]); int a,b; while(1) { scanf("%d%d",&a,&b);
if(!a&&!b) break; g[b].push_back(a); md[a]++; } int mm=0; for(int i=1;i<=n;i++) if(!md[i]) mm=i; dfs(mm); printf("%d\n",max(dp[mm][0],dp[mm][1])); } return 0; }

hdu 1520(樹形dp)