[编程笔记]-Tree_DP树形DP

概念

就是在树上进行DP。(是不是有点废话hhh)

例题

鉴于DP的特殊性,直接上例题解释吧。
AcWing285-爽得要死的舞会

设计状态:

  • f[u][0]:以u为根的子树中(不含u)最大的快乐值。
  • f[u][1]:以u为根的子树中(含u)最大的快乐值。

那么肯定是从子树转移来的嘛。

当不含u时,子节点含不含无所谓;当含u时,子节点只能不含了(倒反天罡了hhh应该改名没有下属的舞会)

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
#include<bits/stdc++.h>
using namespace std;

const int N=6005;

int n;
int l,k;
int h[N];
int f[N][2];
int idk;
int hd[N],to[N],ne[N],fa[N];

void merge(int a,int b){
to[++idk]=b;
ne[idk]=hd[a];
hd[a]=idk;
fa[b]=a;
}

void dfs(int now){
for(int i=hd[now];i;i=ne[i]){
dfs(to[i]);
f[now][0]+=max(f[to[i]][0],f[to[i]][1]);
f[now][1]+=f[to[i]][0];
}
}

int main(){
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>h[i];
f[i][1]=h[i];
}
for(int i=1;i<n;i++){
cin>>l>>k;
merge(k,l);
}
int root=1;
while(fa[root])root=fa[root];
dfs(root);
cout<<max(f[root][0],f[root][1]);
return 0;
}

完结撒花o( ̄︶ ̄)o


[编程笔记]-Tree_DP树形DP
http://githarlem.github.io/2024/08/09/Tree-DP/
作者
Harlem
发布于
2024年8月9日
更新于
2024年8月9日
许可协议