479 加分二叉樹

2021-10-18 04:14:00 字數 1064 閱讀 7046

原題傳送門

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