Anniversary party poj-2342
题目大意:没有上司的舞会原题。
注释:n<=6000,-127<=val<=128.
想法:其实就是最大点独立集。我们介绍树形dp
树形dp就是以节点或者及其子树为信息,进行动态规划。用dfs的原理,遍历,在回溯是更新父亲节点。
然后,关于这道题,我们就可以对于每一个节点进行标记,然后对于满足条件的节点进行遍历。设状态就是两个dp,分别表示选当前根节点和不选当前根节点。更新是瞎jb更新即可... ....
最后,附上丑陋的代码... ...
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int father[6005],vis[6005],dp[6005][2],t; void dfs(int node) { vis[node] = 1; for(int i=1;i<=t;i++) { if(!vis[i]&&father[i]==node) { dfs(i); dp[node][1]+=dp[i][0]; dp[node][0]+=max(dp[i][0],dp[i][1]); } } } int main() { int l,k,root; while(~scanf("%d",&t)) { for(int i=1;i<=t;i++) scanf("%d",&dp[i][1]); root=0; while(scanf("%d%d",&l,&k),l+k>0) { father[l]=k; root=k; } memset(vis,0,sizeof(vis)); dfs(root); printf("%d\n",max(dp[root][1],dp[root][0])); } return 0; }
小结:对于树形dp的路还有很长... ...