AC日記 最大子樹和 洛谷 P1122

2022-05-14 07:20:44 字數 1720 閱讀 2260

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

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

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

輸入格式:

輸入檔案maxsum3.in的第一行乙個整數n(1 ≤ n ≤ 16000)。表示原始的那株花卉上共n 朵花。

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

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

輸出格式:

輸出檔案maxsum3.out僅包括乙個數,表示一系列「修剪」之後所能得到的「美麗指數」之和的最大值。保證絕對值不超過2147483647。

輸入樣例#1:

7

-1 -1 -1 1 1 1 0

1 42 5

3 64 7

5 76 7

輸出樣例#1:

3

【資料規模與約定】

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

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

思路:樹形dp入門題;

二維的dp方程(1表示取,2表示舍);

設1為根開始dfs;

先到末節點,然後再一層一層往回返;

每次取最優,方程在**中;

來,上**:

#include #include 

#define maxn 16005

using

namespace

std;

struct

edgetype ;

struct edgetype edge[maxn<<1

];int if_z,n,dis[maxn],dp[maxn][2

],head[maxn];

int pre[maxn],ans=-0x7ffffff,cnt=0

;bool

if_[maxn];

char

cget;

inline

void

in(int &now)

while(cget>='

0'&&cget<='9'

)

now*=if_z;

}inline

void edge_add(int u,int

v)void search(int

now)

ans=max(ans,max(dp[now][1],dp[now][0

]));

}int

main()

intu,v;

for(int i=1;i)

search(1);

printf(

"%d\n

",ans);

return0;

}

洛谷P1122 最大子樹和

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

洛谷P1122 最大子樹和(樹形dp dfs)

2020.5.21 萌新自從上次區域賽那題碰壁,就勵志學好樹形dp,先從簡單題練練手。樹形結構,前向星自不用說,觀察給出的資料,在每一層的子問題是剪枝和不剪枝,那肯定是如果對答案貢獻大於零就不剪,小於0就剪掉,所以有如下公式 dp u dp v 0?dp v 0回到問題上,我們的子樹可能不止乙個,那...

洛谷P1122 最大子樹和 (樹狀dp)

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