概念
就是在树上进行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