設乙個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行:1個整數n(n<30),為節點個數。
第2行:n個用空格隔開的整數,為每個節點的分數(分數<100)。
第1行:1個整數,為最高加分(ans ≤4,000,000,000)。
第2行:n個用空格隔開的整數,為該樹的前序遍歷。
55 7 1 2 10
1453 1 2 4 5
#include
#include
#include
#include
using
namespace std;
const
int n =50;
int n;
int w[n]
;unsigned f[n]
[n];
int root[n]
[n];
void
dfs(
int l,
int r)
intmain()
}}printf
("%d\n"
, f[1]
[n])
;dfs(1
, n)
;puts(""
);return0;
}
luogu P1040 加分二叉樹
題目詳情 題目分析 解法是記憶化搜尋。val i j 存的是i到j區間內的最高加分。tree 33 據題意可得,tree陣列存的是樹的中序遍歷順序。root i j 存的是tree陣列從i到j的最優根,即以此為根保證此子樹最高加分。通過中序遍歷性質可知 若x為根節點,1 x 1為左子樹,x 1 n為...
luogu P1040 加分二叉樹 題解
今天考試考了乙個區間dp.沒錯就是這個.太蒟了真是連區間dp都不會.看了看題解也看不懂,於是請了某獴dalao給補充了一下。在這裡把自己的理解寫下來,算是給一些像我一樣不會區間dp的萌新們一點指引。所謂區間dp,顧名思義就是在一段區間上的動態規劃。它既要滿足dp問題的最優子結構和無後效性外,還應該符...
洛谷1040 加分二叉樹
題目描述 設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 su...