luogu P1040 加分二叉樹

2021-09-27 18:05:36 字數 959 閱讀 9016

設乙個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...