Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6955 | Accepted: 4003 |
7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0
5
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define INF 1<<30 using namespace std; int father[6003],dp[6003][2],visit[6003],N,l,k,root; void dfs(int node){ // visit[node]=1; for(int i=1;i<=N;i++){ if(/*visit[i]==0&&*/father[i]==node){ dfs(i); dp[node][1]+=dp[i][0]; dp[node][0]+=max(dp[i][1],dp[i][0]); } } } int main(){ // freopen("01.txt","r",stdin); scanf("%d",&N); for(int i=1;i<=N;i++){ scanf("%d",&dp[i][1]);//去的情况 } while(scanf("%d%d",&l,&k)==2&&l+k>0){ father[l]=k; root=k; } dfs(root); printf("%d\n",max(dp[root][0],dp[root][1])); return 0; }我不会说这是TYVJ P1052 没有上司的舞会(数据都一样...)
//题意:有n个人,接下来n行是n个人的价值,再接下来n行给出l,k说的是l的上司是k,这里注意l与k是不能同时出现的
//思路:用dp数据来记录价值,开数组用下标记录去或者不去
则状态转移方程为:
DP[i][1] += DP[j][0],
DP[i][0] += max{DP[j][0],DP[j][1]};其中j为i的孩子节点。
这样,从根节点r进行dfs,最后结果为max{DP[r][0],DP[r][1]
原文:http://www.cnblogs.com/radiumlrb/p/5786898.html