加分二叉樹

2021-10-25 15:16:18 字數 1095 閱讀 7735

設乙個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行:乙個整數,為最高加分(結果不會超過int範圍)。

第2行:n個用空格隔開的整數,為該樹的前序遍歷。如果存在多種方案,則輸出字典序最小的方案。

資料範圍

n<30

輸入樣例:

55 7 1 2 10

輸出樣例:

1453 1 2 4 5

這道題就是矩陣連乘的類似題目,雖然給出的是中序遍歷,但是求dp過程和樹是沒關係的,就是矩陣連乘,dp的狀態表示用f[i][j]來表示從i到j區間的最佳值,依次根據題意列舉更新就行了,用s來存放最佳的值,才用dfs可以輸出前序遍歷的順序

#include

using

namespace std;

const

int n=35;

int f[n]

[n];

int s[n]

[n];

//記錄每個區間的最佳的分割點

int w[n]

;int n;

void

dfs(

int l,

int r)

//輸出前序遍歷

intmain()

}}cout<[n]

1,n)

;}

加分二叉樹

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

加分二叉樹

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

加分二叉樹

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