标签:
Description
Input
Output
Sample Input
7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0
Sample Output
5
【题意】有n个人,分别给出了每个人的价值,他们要被邀请去参加聚会,但是每个人不能和自己的直接领导同时被邀请,问邀请后实现的最大价值是多少
【思路】dp[k][1]+=dp[i][0]表示k是i的领导,1表示去,0表示不去,领导k去了,i就不去了;
dp[k][0]+=max(dp[i][0],dp[i][1]);领导k不去,i可去可不去,取大值
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int N=6005; int n; int fa[N],vis[N],dp[N][2]; void dfs(int k) { vis[k]=1; for(int i=1; i<=n; i++) { if(!vis[i]&&fa[i]==k) { dfs(i); dp[k][1]+=dp[i][0]; dp[k][0]+=max(dp[i][0],dp[i][1]); } } } int main() { while(~scanf("%d",&n)) { memset(fa,0,sizeof(fa)); for(int i=1; i<=n; i++) { scanf("%d",&dp[i][1]); } int k=0; int a,b; while(scanf("%d%d",&a,&b)) { if(a==0&&b==0) break; fa[a]=b; k=b; } memset(vis,0,sizeof(vis)); dfs(k); printf("%d\n",max(dp[k][0],dp[k][1])); } return 0; }
标签:
原文地址:http://www.cnblogs.com/iwantstrong/p/5842697.html