樹形DP學習筆記

樹形DP
數組

入門模板題 poj P2342spa

  大意就是一羣職員之間有上下級關係,每一個職員有一個快樂值,可是隻有在他的直接上級不在場的狀況下才會快樂。求舉行一場聚會的快樂值之和的最大值。設計

 

求解code

  聲明一個數組,f[i][j]。f[i][0]表示不邀請第i個員工時,該員工子樹上的最大快樂值之和。f[i][1]則表示邀請時子樹的最大快樂值之和。blog

 

#include <cstdio>
#include <cstring>
#include <vector>
#define MAX_N 6000
using namespace std;

int n;
int fa[MAX_N+5];    //該員工的上級 
int f[MAX_N+5][3];    //f[i][0]不邀請該員工,該節點子樹上的的最大快樂值  

vector<int> G[MAX_N+5];        //建圖 記錄該員工的下級 
int root=1;

inline int max(int a,int b){
    return a>b?a:b;
}

void dfs(int root){
    for (int i=0;i<G[root].size();i++)
        dfs(G[root][i]);
    for (int i=0;i<G[root].size();i++){
        f[root][0]+=max(f[G[root][i]][0],f[G[root][i]][1]);
        f[root][1]+=f[G[root][i]][0]; 
    }
}    
int main(){
//    freopen("test1.in","r",stdin);
    memset(fa,-1,sizeof(fa));
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&f[i][1]);
    int father,so;
    while (scanf("%d%d",&so,&father)&&father&&so){    //建圖 
        G[father].push_back(so);
        fa[so]=father;
    }
    while (fa[root]!=-1)    root=fa[root];    //找到根節點 
    dfs(root);
    printf("%d",max(f[root][0],f[root][1]));
    return 0;
}

 

[參考《挑戰程序設計》第二版及網上資料]get

相關文章
相關標籤/搜索