LUOGU1122 最大子樹和 樹形動規

2022-02-06 04:04:03 字數 1826 閱讀 6006

小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題:

一株奇怪的花卉,上面共連有 nn n 朵花,共有 n−1n-1n−1 條枝幹將花兒連在一起,並且未修剪時每朵花都不是孤立的。每朵花都有乙個「美麗指數」,該數越大說明這朵花越漂亮,也有「美麗指數」為負數的,說明這朵花看著都讓人噁心。所謂「修剪」,意為:去掉其中的一條枝條,這樣一株花就成了兩株,扔掉其中一株。經過一系列「修剪「之後,還剩下最後一株花(也可能是一朵)。老師的任務就是:通過一系列「修剪」(也可以什麼「修剪」都不進行),使剩下的那株(那朵)花卉上所有花朵的「美麗指數」之和最大。

老師想了一會兒,給出了正解。小明見問題被輕易攻破,相當不爽,於是又拿來問你。

輸入格式:

第一行乙個整數 n(1≤n≤16000)n(1 ≤ n ≤ 16000)n(1≤n≤16000) 。表示原始的那株花卉上共 nn n 朵花。

第二行有 nn n 個整數,第 iii 個整數表示第 iii 朵花的美麗指數。

接下來 n−1n-1n−1 行每行兩個整數 a,ba,ba,b ,表示存在一條連線第 aaa 朵花和第 bbb 朵花的枝條。

輸出格式:

乙個數,表示一系列「修剪」之後所能得到的「美麗指數」之和的最大值。保證絕對值不超過 214748364721474836472147483647 。

輸入樣例#1:

7

-1 -1 -1 1 1 1 0

1 42 5

3 64 7

5 76 7

輸出樣例#1:

3

【資料規模與約定】

對於 60%60\%60% 的資料,有 n≤1000n≤1000n≤1000 ;

對於 100%100\%100% 的資料,有 n≤16000n≤16000n≤16000 。

題解:

昨天考試讓我下定決心搞一搞我一點都不會的樹形dp;

然後翻到了這道神題;

其實我一點都不會瞎jb寫就a了...

設f[i]表示第i個子樹的最大和;

然後我就沒有意識了,蒙出了乙份ac**:

#include #include 

using

namespace

std;

intn;

struct

edge

ed[32010

];int head[16010

], cnt;

inline

void add(int x, int y);head[x]=cnt;}

int val[16010

];int f[16010

];inline

void dp(int x,int

fa)}

intmain()

for (int i = 1; i <= n; i++) f[i] =val[i];

dp(1, 0

);

int ans = 0

;

for (register int i = 1 ; i <= n ; i ++) ans =max(ans, f[i]);

//for (register int i=1;i<=n;i++)

//printf("x=%d, f[x]=%d\n",i,f[i]);

coutreturn0;

}

P1122 最大子樹和

小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題 一株奇怪的花卉,上面共連有nn朵花,共有n 1n 1條枝幹將花兒連在一起,並且未修剪時...

P1122 最大子樹和 題解

同步 原題鏈結 簡要題意 給定一棵 n nn 個節點的樹,有點權,求其中最大的連通塊之和。資料範圍 n 1.6 1 04 n leq 1.6 times 10 4 n 1.6 104.很顯然,考慮用樹形 dp text dp 解決此題。f uf u fu 表示以 u uu 為根的子樹中包含 u uu...

P1122 最大子樹和 題解

csdn同步 原題鏈結 簡要題意 給定一棵 n 個節點的樹,有點權,求其中最大的連通塊之和。資料範圍 n leq 1.6 times 10 4 很顯然,考慮用樹形 text 解決此題。f u 表示以 u 為根的子樹中包含 u 節點的答案。則易得 f u a u max u max f v 0 時間複...