NOIP2013提高組T3 加分二叉樹

2022-03-17 17:06:56 字數 3057 閱讀 6269

題目描述

設乙個n個節點的二叉樹tree的中序遍歷為(1,2,3,…,n),其中數字1,2,3,…,n為節點編號。每個節點都有乙個分數(均為正整數),記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree(也包含tree本身)的加分計算方法如下:

subtree的左子樹的加分× subtree的右子樹的加分+subtree的根的分數。

若某個子樹為空,規定其加分為1,葉子的加分就是葉節點本身的分數。不考慮它的空子樹。

試求一棵符合中序遍歷為(1,2,3,…,n)且加分最高的二叉樹tree。要求輸出;

(1)tree的最高加分

(2)tree的前序遍歷

輸入輸出格式

輸入格式:

第1行:乙個整數n(n<30),為節點個數。

第2行:n個用空格隔開的整數,為每個節點的分數(分數<100)。

輸出格式:

第1行:乙個整數,為最高加分(結果不會超過4,000,000,000)。

第2行:n個用空格隔開的整數,為該樹的前序遍歷。

輸入輸出樣例

輸入樣例#1

55 7 1 2 10

輸出樣例#1

1453 1 2 4 5

演算法:

區間dp

分析:

這個10多年前的提高組試題其實也不算太難,但是有很多要注意的小點。

首先這道題上手先分析感覺和樹形dp有點關係,然而再看清楚一點呢,就發現它其實只是在區間上dp,然而樹只是對它的乙個約束。

我們先來簡化題目,假如我問的是在乙個區間上求最大加分,那麼這個狀態轉移方程應該很容易得到,就是f[i][j]=max(f[i][k-1]*f[k+1][j]+a[k])其中表示從i到j的區間最大值,k滿足i<=k<=j。

注意這裡可以取等。

接下來,有乙個性質:

對於任意二叉樹,其中序遍歷中的任意一段區間的根節點可以是任何乙個節點。

那麼問題解決。

這個就可以直接套用到區間dp中,不過還要記錄下相應的i,j的根節點是什麼。最後輸出先序遍歷的過程其實就是dfs的思想,加乙個記憶化搜尋會提高效率。

要點注意:

1、為了方便除錯,可以將陣列開到6,但注意要調回正常值在提交

2、存答案的陣列要用long long,否則會wa

3、記憶化部分要確定有值(非空子樹)才遞迴下去

4、初始化答案陣列f要放在輸入前

5、注意要先定好某次遞推的區間長度,否則會找到沒運算過的值。

上**:

1 #include2 #include3

using

namespace

std;45

long

long f[35][35]; //

注意要用超長整型

6int n,r[35][35],a[35],fl=0;7

8 inline int

read()918

19void tree(int lt,int

rt)20

28if (r[lt][r[lt][rt]-1]) //

遞迴左子樹

29 tree(lt,r[lt][rt]-1

);30

if (r[r[lt][rt]+1][rt]) //

遞迴右子樹

31 tree(r[lt][rt]+1

,rt);32}

3334

intmain()

3547

/*//注意這種方法不可取

48for (i=1;i<=n-1;i++)

49for (j=i+1;j<=n;j++)

5058

f[i][j]=tmp;59}

60*/

61for (len=1;len<=n;len++) //

先定區間長度

62for (i=1;i+len<=n;i++) //

設起點,i+len為終點

6371 f[i][i+len]=tmp;72}

73 printf("

%lld\n

",f[1

][n]);

74 tree(1

,n);

75return0;

76 }

講講memset為什麼不行,因為在c++中memset是按位來賦值的,乙個int是4位,乙個long long是8位(好像是吧),所以一次就會推了8個1,而不是想要的乙個1。而對於清零和賦極值memset是很好用的。

嗯,就這樣了。

NOIP2013提高組 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOIP2013提高組解析

題目描述 轉圈遊戲 火柴排隊 貨車運輸 積木大賽 花匠 華容道day1 轉圈遊戲 最終位置實際上就是 x m 10 k n 快速冪即可。include includeusing namespace std int n,m,k,x int power int k int main 火柴排隊 根據感覺可...

NOIP2013提高組 花匠

題目描述 花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g...