樹形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