hdu 1520(樹形dp)
阿新 • • 發佈:2017-08-17
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)