anniversary party_hdu1520

原本覺得是一道很簡單的提,能夠分分鐘解決(實際上就是很簡單)ios

然而一直報錯,找半天,居然要多組輸入(仍是太菜了)spa

因此每組須要先初始化,ci

這是一道樹形DP的簡單題,具體思路就是我選這個上司就不能選他的直屬下級,若是不選這個上司,那麼選不選他的直屬下級要看rate怎麼樣it

接下來放代碼:io

#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=6001;
int dp[N][2],father[N];//rate[N];
vector<int>tree[N];
int n;
void dfs(int fa){
dp[fa][0]=0;
//dp[fa][1]=rate[fa];
for(int i=0;i<tree[fa].size();i++){
int child=tree[fa][i];
dfs(child);
dp[fa][0]+=max(dp[child][0],dp[child][1]);
dp[fa][1]+=dp[child][0];
}
}
int main()
{
//while(~scnaf("%d",&n)){
while(cin>>n){
for(int i=1;i<=n;i++){
scanf("%d",&dp[i][1]);
tree[i].clear();
father[i]=0;
}
int x,y;
scanf("%d%d",&x,&y);
while(x&&y){
tree[y].push_back(x);
father[x]=y;
scanf("%d%d",&x,&y);
}
int t=1;
while(father[t])t=father[t];
/*
int ans=0;
for(int i=1;i<=n;i++){
if(!father[i]){
dfs(i);
ans+=max(dp[i][0],dp[i][1]);
}
}
cout << ans << endl;
*/
dfs(t);
cout << max(dp[t][0],dp[t][1]) << endl;
}
return 0;
}stream

相關文章
相關標籤/搜索