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

2022-05-06 09:24:08 字數 2678 閱讀 4236

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

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

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

輸入格式:

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

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

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

輸出格式:

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

輸入樣例:

7

-1 -1 -1 1 1 1 0

1 42 5

3 64 7

5 76 7

輸出樣例:

3

樹狀dp的入門題,做完這道題對樹有了新的理解。樹不一定是我們通常理解的樹(根是不變的)。樹形結構代表的特點是連線和層次。

個人認為:這個題沒有真正的樹根只要隨便找乙個節點開始計算即可。

中心思想就是把連線兩個點的邊存起來,然後處理這個串上的邊,比如這條串上的上一條邊是什麼,這條串的最後乙個節點是什麼。詳細題解寫到注釋裡了

有的地方可能解釋的不清楚,大家意會吧......

**如下:

1 #include 2

3using

namespace

std;

4#define inf 0x3f3f3f3f

5int flower[16600],n,next[40010],pre[40010],last[40010],f[16600],num=0;6

/*7flower[i]表示第i個節點的值

8next[i]表示編號為i的邊的下乙個節點的值

9pre[i]表示編號為i的邊的上乙個節點相連的邊的編號

10last[i]表示與第i個節點相連的最後一條邊的編號(因為與i節點相連的邊可能不止一條)

11last[i]也可以理解成許多節點用邊相連形成一條串,第i條邊在這個串中的上一條邊就是last[i]

12f[i]表示第i節點的子樹的最大和

13*/

14bool vis[16600];//

標記每個節點是否訪問過

15int ans=-inf;

16void cnct(int x,int

y)17

23int dfs (int

u)24

38 i=pre[i];//

再找i的前乙個邊39}

40 f[u]=sum+flower[u];

41if(f[u]>ans) ans=f[u];

42return

f[u];43}

44int

main()

4563 vis[1]=1

;64 dfs(1

);65 printf("

%d\n

",ans);

66return0;

67 }

下面補上乙個利用vector存邊的做法,比較好理解

**如下:

1 #include 2

3using

namespace

std;

4#define inf 0x3f3f3f3f

5struct

edge6;

9 vector e[16010];//

用vector陣列來表示每個點相鄰的點

10int result=-inf,n,f[16010],flower[16010];//

f[i]為節點i的子樹的最大值

11bool vis[16010

];12

int dfs (int

x)1325}

26 result=max(result,f[x]);

27return

f[x];28}

29int

main()

3041

for (int i=1;ii)

42);

46e[p2].push_back((edge));47}

48 vis[1]=true

;49 dfs(1

);50 printf("

%d\n

",result);

51return0;

52 }

洛谷P1122 最大子樹和

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

P1122 最大子樹和

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

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

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