某大學有N個職員,編號爲1~N。他們之間有從屬關係,也就是說他們的關係就像一棵以校長爲根的樹,父結點就是子結點的直接上司。如今有個週年慶宴會,宴會每邀請來一個職員都會增長必定的快樂指數Ri,可是呢,若是某個職員的上司來參加舞會了,那麼這個職員就不管如何也不願來參加舞會了。因此,請你編程計算,邀請哪些職員能夠使快樂指數最大,求最大的快樂指數。ios
輸入格式:編程
第一行一個整數N。(1<=N<=6000)ide
接下來N行,第i+1行表示i號職員的快樂指數Ri。(-128<=Ri<=127)spa
接下來N-1行,每行輸入一對整數L,K。表示K是L的直接上司。code
最後一行輸入0 0blog
輸出格式:ip
輸出最大的快樂指數。ci
7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0
5
——————————————————————————————————我是華麗麗的分割線————————————————————————————————
樹形動規果題。
1 /* 2 Problem:P1352 沒有上司的舞會 3 OJ: 洛谷 4 User: S.B.S. 5 Time: 27 ms 6 Memory: 16992 kb 7 Length: N/A 8 */ 9 #include<iostream> 10 #include<cstdio> 11 #include<cstring> 12 #include<cmath> 13 #include<algorithm> 14 #include<queue> 15 #include<cstdlib> 16 #include<iomanip> 17 #include<cassert> 18 #include<climits> 19 #include<functional> 20 #include<bitset> 21 #include<vector> 22 #include<list> 23 #include<map> 24 #define F(i,j,k) for(int i=j;i<=k;i++) 25 #define M(a,b) memset(a,b,sizeof(a)) 26 #define FF(i,j,k) for(int i=j;i>=k;i--) 27 #define maxn 10001 28 #define inf 0x3f3f3f3f 29 #define maxm 1001 30 #define mod 998244353 31 //#define LOCAL 32 using namespace std; 33 int read(){ 34 int x=0,f=1;char ch=getchar(); 35 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 36 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 37 return x*f; 38 } 39 int n,m; 40 int x,y,k; 41 int cnt,c[maxn],head[maxn]; 42 bool b[maxn]; 43 int f[maxn][2]; 44 vector <int> edge[maxn]; 45 void dfs(int u) 46 { 47 int a,b; 48 for(int i=0;i<edge[u].size();i++) 49 { 50 dfs(edge[u][i]); 51 f[u][0]+=max(f[edge[u][i]][0],f[edge[u][i]][1]); 52 f[u][1]+=f[edge[u][i]][0]; 53 } 54 f[u][1]+=c[u]; 55 } 56 int main() 57 { 58 std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y; 59 #ifdef LOCAL 60 freopen("data.in","r",stdin); 61 freopen("data.out","w",stdout); 62 #endif 63 int n,m; 64 cin>>n; 65 for(int i=1;i<=n;i++) cin>>c[i]; 66 int x,y; 67 for(int i=1;i<=n;i++) 68 { 69 cin>>x>>y; 70 if(x==0&&y==0) break; 71 else 72 { 73 edge[y].push_back(x); 74 b[x]=true; 75 } 76 } 77 for(int i=1;i<=n;i++) 78 { 79 if(b[i]==false) 80 { 81 dfs(i); 82 cout<<max(f[i][1],f[i][0])<<endl; 83 break; 84 } 85 } 86 return 0; 87 }