1. 程式人生 > 實用技巧 >洛谷P1352沒有上司的舞會-題解

洛谷P1352沒有上司的舞會-題解

原題:

思路:


經典樹形DP

藉此題講解一下樹形DP

顧名思義,樹形DP以「子樹」作為單位進行DP

由於這個性質,DFS成了實現的最好選擇

先DFS求出子問題,隨後得出當前規模答案。

詳見程式碼

程式碼:

#include <bits/stdc++.h>
using namespace std;
int n,a[6050];
int v_[6050];
int f[6050][6050];
struct edge
{
    int u,v,nxt;
}E[6050];
int h[6050];
int cnt;
void add_edge(int u,int v)
{
    E[cnt++].u=u;
    E[cnt].v=v;
    E[cnt].nxt=h[u];
    h[u]=cnt;
}
void dp(int x)
{
    f[x][0]=0;
    f[x][1]=a[x];
    for(int i=h[x];i;i=E[i].nxt)
    {
        dp(E[i].v);
        f[x][0]+=max(f[E[i].v][0],f[E[i].v][1]);
        f[x][1]+=f[E[i].v][0];
    }
}
int main()
{
    cin >> n;
    for(int i=1;i<=n;i++)
        cin >> a[i];
    for(int i=1;i<=n-1;i++)
    {
        int u,v;
        cin >> u >> v;
        add_edge(v,u);
        v_[u]=1;
    }
    int rt;
    for(int i=1;i<=n;i++)
        if(!v_[i])
        {
            rt=i;
            break;
        }
    dp(rt);
    cout << max(f[rt][0],f[rt][1]) << endl;
    return 0;
}