hdu1520 树形dp
树形dp入门,在树上进行dp。
状态转移方程:
dp[i][0] = max(dp[j][0], dp[j][1]);//i为j的上司 并且i不来
dp[i][1] = dp[j][0];//i来了
用vector实现 rt表示树。
#include <cstdio> #include <cstring> #include <iostream> #include <vector> using namespace std; const int MAXN = 6010; vector<int> rt[MAXN]; int dp[MAXN][2],n,vis[MAXN], pa[MAXN]; int max(int x,int y){ return x>y?x:y; } void tree_dp(int root) { vis[root] = 1; int len = rt[root].size(); for(int i=0; i<len; i++){ if(!vis[rt[root][i]]){ tree_dp(rt[root][i]); dp[root][1] += dp[rt[root][i]][0]; dp[root][0] += max(dp[rt[root][i]][0], dp[rt[root][i]][1]); } } } int main() { int i; while(~scanf("%d",&n)) { memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); memset(pa,-1,sizeof(pa)); for(i=1; i<=n; ++i){ int v; rt[i].clear(); scanf("%d",&v); dp[i][1] = v; } int x,y; while(scanf("%d%d",&x,&y)){ if(!x && !y)break; pa[x] = y; rt[y].push_back(x); } int root = 1; while(pa[root]!=-1) root = pa[root]; tree_dp(root); printf("%d\n",max(dp[root][0], dp[root][1])); } }