題目描述
設乙個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 #include3using
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...