樹形dp入門(未完待續)

沒有上司的舞會

在這裏插入圖片描述
樹形dp
用vector建圖,找到沒有boss的那個點,從這個點開始dfs
而每個點都有兩種情況,一是選擇這個點取得的最大值和不選取得最大值,dp[i][1]表示選擇這個點時的最大值, dp[i][0]表示不選這個點取得最大值,方程式爲 dp[x][0]+=max(dp[i][1],dp[i][0]);dp[x][1]+=dp[i][0];

#include <iostream>
#include <cstdio>
#include <vector>
#define MAX 6010
using namespace std;
int dp[MAX][2];
int N;
int happiness[MAX];
vector<int> edge[MAX];
void dfs(int u)
{
    dp[u][0] = 0;
    dp[u][1] = happiness[u];
    for(int v:edge[u])
    {
        dfs(v);
        dp[u][0] += max(dp[v][0],dp[v][1]);
        dp[u][1] += dp[v][0];
    }
}
/* 
    
*/
int boss[MAX];
int main()
{
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
        scanf("%d",&happiness[i]);
   
    for(int i=0;i<N-1;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        edge[y].push_back(x);
        boss[x] = y;
    }
    int root = 1;
    for(int i=1;i<=N;i++)
    {
        if(boss[i]==0)
        {
            dfs(i);
            root = i;
            break;
        }
    }
    printf("%d\n",max(dp[root][0],dp[root][1]));
    getchar();
    getchar();

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章