原題傳送門
設乙個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,為節點個數。
第2行:n個用空格隔開的整數,為每個節點的分數(0《分數<100)。
輸出格式
第1行:乙個整數,為最高加分(結果不會超過4,000,000,000)。
第2行:n個用空格隔開的整數,為該樹的前序遍歷。如果存在多種方案,則輸出字典序最小的方案。
資料範圍
n<30
輸入樣例
557
1210
輸出樣例14531
245
本題涉及到的是區位dp和二叉樹
主要是考慮每一小段的最優解,然後合併得到整個樹的最優解
演算法的複雜度是n^3,但是資料並不大所以不會tle
#include
#define n 51
int n;
int v[n]
;int g[n]
[n];
int f[n]
[n];
void
nebula
(int l,
int r)
intmain()
}}printf
("%d\n"
,f[1
][n]);
nebula(1
,n);
}
Acwing 479 加分二叉樹(區間dp)
495 老師用了區間dp dp l r 是左邊界l,右邊界r的最大加分 同時還需要設乙個k表示根節點,然後dp l k 1 表示左子樹最大加分,dp k 1 r 表示有指數最大加分。然後遍歷這 一區間最大的加分就可,題目中要求輸出乙個前序的序列,那我們把每乙個最大區間也就是dp l k 1 dp k...
AcWing 479 加分二叉樹(區間dp)
題目大意 構造一顆 n nn 個節點的二叉樹,其編號為 1,2 3,n 1,2,3,n 1,2,3,n 每個節點都有乙個權值 w iw i wi 子樹的權值 左子樹權值 右子樹權值 根節點權值 若某個子樹為空,規定其權值為 1 11。葉子的加分就是葉節點本身的分數,不考慮它的空子樹。試求一棵符合中序...
加分二叉樹
描述 設乙個n個節點的二叉樹tree的中序遍歷為 l,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 subt...