Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3719 | Accepted: 2080 |
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
子节点与父节点不能同时选,求权值,简单树形dp
dp[u][0]表示当前节点不选,dp[u][1]表示当前节点选。
状态方程:dp[u][0]+=max(dp[v][0],dp[v][1])表示当前节点不选时叠加子节点选与不选的最大值。
dp[u][1]+=dp[v][0],表示当前节点选时,子节点不选。
代码:
/* *********************************************** Author :xianxingwuguan Created Time :2014-2-6 3:11:18 File Name :3.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; const int maxn=10001; int head[maxn],weight[maxn],dp[maxn][2],tol; struct node{ int next,to; }edge[2*maxn]; void add(int u,int v){ edge[tol].to=v; edge[tol].next=head[u]; head[u]=tol++; } void dfs(int u,int fa){ dp[u][1]=weight[u]; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to; if(v==fa)continue; dfs(v,u); dp[u][1]+=dp[v][0]; dp[u][0]+=max(dp[v][1],dp[v][0]); } } int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int i,j,k,m,n; while(~scanf("%d",&n)){ memset(head,-1,sizeof(head));tol=0; memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) scanf("%d",&weight[i]); while(~scanf("%d%d",&i,&j)&&i&&j){ add(i,j); add(j,i); } dfs(1,-1); //cout<<"hahha"<<endl; printf("%d\n",max(dp[1][0],dp[1][1])); } return 0; }
原文:http://blog.csdn.net/xianxingwuguan1/article/details/18945153