洛谷 題解 P1352 【沒有上司的舞會】
阿新 • • 發佈:2019-05-08
i++ its end max const using out 遍歷 ++
樹形DP的一道較為基礎的模板題
- 狀態
dp[i][0/1]為第i個員工是否來參加的最大值
- 轉移
先找到根節點
先遍歷完它的兒子,再來更新答案
dp[i][0]+=max(dp[j][0],dp[j][1]);//j為i的兒子,i不來,那j可來可不來
dp[i][1]+=dp[j][0];//j為i的兒子,i來,那只能不來
- 初始
dp[i][0]=0;//不來的初始值為0
dp[i][1]=r[i];//來的初始值就是此人的快樂指數
- 答案
很明顯就是大BOSS來不來的問題了
max(dp[root][0],dp[root][1]);
完整代碼:
#include<bits/stdc++.h> using namespace std; const int N=6000+10; int n,m; int r[N]; bool v[N]; vector<int>son[N]; int dp[N][2]; inline int read() { int tot=0,f=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9') { tot=tot*10+c-'0'; c=getchar(); } return tot*f; } inline void f(int now) { dp[now][0]=0; dp[now][1]=r[now]; for(int i=0;i<son[now].size();i++) { int x=son[now][i]; f(x); dp[now][0]+=max(dp[x][0],dp[x][1]); dp[now][1]+=dp[x][0]; } } int main() { n=read(); for(int i=1;i<=n;i++)r[i]=read(); int x,y; for(int i=1;i<n;i++) { x=read();y=read(); son[y].push_back(x); v[x]=1; } int root; for(int i=1;i<=n;i++) if(!v[i]) { root=i; break; } f(root); int ans=max(dp[root][1],dp[root][0]); cout<<ans<<endl; return 0; }
洛谷 題解 P1352 【沒有上司的舞會】