洛谷P1122 最大子树和 树形DP初步
小明對(duì)數(shù)學(xué)飽有興趣,并且是個(gè)勤奮好學(xué)的學(xué)生,總是在課后留在教室向老師請(qǐng)教一些問(wèn)題。一天他早晨騎車去上課,路上見到一個(gè)老伯正在修剪花花草草,頓時(shí)想到了一個(gè)有關(guān)修剪花卉的問(wèn)題。于是當(dāng)日課后,小明就向老師提出了這個(gè)問(wèn)題:
一株奇怪的花卉,上面共連有NN朵花,共有N-1N?1條枝干將花兒連在一起,并且未修剪時(shí)每朵花都不是孤立的。每朵花都有一個(gè)“美麗指數(shù)”,該數(shù)越大說(shuō)明這朵花越漂亮,也有“美麗指數(shù)”為負(fù)數(shù)的,說(shuō)明這朵花看著都讓人惡心。所謂“修剪”,意為:去掉其中的一條枝條,這樣一株花就成了兩株,扔掉其中一株。經(jīng)過(guò)一系列“修剪“之后,還剩下最后一株花(也可能是一朵)。老師的任務(wù)就是:通過(guò)一系列“修剪”(也可以什么“修剪”都不進(jìn)行),使剩下的那株(那朵)花卉上所有花朵的“美麗指數(shù)”之和最大。
老師想了一會(huì)兒,給出了正解。小明見問(wèn)題被輕易攻破,相當(dāng)不爽,于是又拿來(lái)問(wèn)你。
輸入格式
第一行一個(gè)整數(shù)N(1 ≤ N ≤ 16000)N(1≤N≤16000)。表示原始的那株花卉上共NN朵花。
第二行有NN個(gè)整數(shù),第II個(gè)整數(shù)表示第II朵花的美麗指數(shù)。
接下來(lái)N-1N?1行每行兩個(gè)整數(shù)a,ba,b,表示存在一條連接第aa?朵花和第bb朵花的枝條。
輸出格式
一個(gè)數(shù),表示一系列“修剪”之后所能得到的“美麗指數(shù)”之和的最大值。保證絕對(duì)值不超過(guò)21474836472147483647。
輸入輸出樣例
輸入 #1復(fù)制
7 -1 -1 -1 1 1 1 0 1 4 2 5 3 6 4 7 5 7 6 7輸出 #1復(fù)制
3說(shuō)明/提示
【數(shù)據(jù)規(guī)模與約定】
對(duì)于60\%60%的數(shù)據(jù),有N≤1000N≤1000;
對(duì)于100\%100%的數(shù)據(jù),有N≤16000N≤16000。
這個(gè)題,比較簡(jiǎn)單,就是求一顆權(quán)值最大子樹的權(quán)值,記憶化搜索,每次保留最大權(quán)值即可。、
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; vector<int>E[maxn]; int n,w[maxn],ans1=0; void add(int x,int y) {E[x].push_back(y);E[y].push_back(x); } int dp(int ver,int fa) {int ans=w[ver];for(int i=0;i<E[ver].size();i++)if(E[ver][i]!=fa) ans+=max(0,dp(E[ver][i],ver));ans1=max(ans1,ans);return ans; } int main(){scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",w[i]);for(int i=1,x,y;i<=n-1;i++){scanf("%d%d",&x,&y);E[x].push_back(y);//無(wú)向圖存 E[y].push_back(x);}dp(1,0); printf("%d\n",ans1);return 0; }?
總結(jié)
以上是生活随笔為你收集整理的洛谷P1122 最大子树和 树形DP初步的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 图论--树的直径--DFS+树形DP模板
- 下一篇: 洛谷 P1352 没有上司的舞会(树形