码迷,mamicode.com
首页 > 其他好文 > 详细

树形DP

时间:2019-10-01 14:03:04      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:oid   权重   nbsp   std   block   class   状态   creat   memset   

hdu1520
题意:

给一棵有根数,每个点有权重,相邻点不能同时出现,问怎么取点可以使得权重最大

思路:

每个结点有两种状态,取和不取,用0表示不选,1表示选中
状态: dp[i][1]表示取第i个点,dp[i][0]表示不取第i个点。
转移: dp[u][0] += max (dp[v][0], dp[v][1]) 不取父节点,子节点可以取或不取
dp[u][1] += dp[v][0] 取父节点,不能取子节点
其中v是u的所有子节点
建树: 有向树,用连接表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

> File Name: 1520.cpp
> Author: mazicwong
> Mail: mazicwong@gmail.com
> Created Time: 2017年08月16日 星期三 23时03分31秒
************************************************************************/


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
/*
* 状态:
* dp[i,0]: 不取i点时的最大
* dp[i,1]: 取i点时的最大
*
* 转移:
* dp[i,0] += max{dp[j][0],dp[j][1]}
* dp[i,1] += dp[j,0]
* 其中j为i的所有儿子
*
* dfs结果,max{dp[root,0],dp[root,1]}
*
*/

const int maxn = 6000+5;

int dp[maxn][2];
int fa[maxn];
int in[maxn];
bool vis[maxn];
int n;

struct {
int v;
int next;
}e[maxn<<1];

int cnt,head[maxn];

void addedge(int u,int v)
{
e[cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt++;
}

void dfs(int u)
{
vis[u]=true;
for(int i=head[u];i!=-1;i=e[i].next)
{
// if (!vis[i])
// {
int v=e[i].v;
dfs(v);
dp[u][0] += max(dp[v][0], dp[v][1]);
dp[u][1] += dp[v][0];
// }
}
}
int main()
{
freopen("in","r",stdin);
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
memset(in,0,sizeof(in));
cnt=0;
memset(head,-1,sizeof(head));

for (int i=1;i<=n;i++)
scanf("%d",&dp[i][1]);//边界

int u,v;
while(scanf("%d%d",&v,&u)!=EOF && v && u)
{
addedge(u,v);
in[v]++;
}
for (int i=1;i<=n;i++)
{
if (in[i]==0)//root
{
dfs(i);
printf("%dn",max(dp[i][0],dp[i][1]));
break;
}
}
}
return 0;
}

原文:大专栏  树形DP


树形DP

标签:oid   权重   nbsp   std   block   class   状态   creat   memset   

原文地址:https://www.cnblogs.com/petewell/p/11615251.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!