NOIP2003提高組 加分二叉樹

2021-07-24 03:31:05 字數 1103 閱讀 3470

設乙個n個節點的二叉樹tree的中序遍歷為(l,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的前序遍歷

dp。

我們設fi,

j 為i到j的最高分數,gi

,j為i到j的最高分數時,i到

j 的根節點。

那麼我們將i~j分成兩段(分開的地方列舉一下),由分開的兩段更新i~j。

所以,dp方程為fi

,j=m

ax(f

[i][

k−1]

∗f[k

+1][

j]+a

[k])

,(i≤

k≤j)

對於求前序遍歷,我們只要從g1

,n開始向兩邊用遞迴搜就行了。

#include

#include

#include

#include

#define n 40

#define ll long long

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fd(i,a,b) for(i=a;i>=b;i--)

using namespace std;

ll f[n][n],a[n],i,j,k,n,g[n][n];

void qxbl(ll l,ll r)

int main()

fd(i,n,1)

fo(j,i+1,n)

fo(k,i,j)

}printf("%lld\n",f[1][n]);

qxbl(1,n);

}

NOIP2003 提高組 加分二叉樹

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

NOIP 2003 提高組 複賽 加分二叉樹

noip 2003 提高組 複賽 加分二叉樹 1.樣例1分析是關鍵 輸入 5 5 7 1 2 10 輸出 145 3 1 2 4 5 1 2 3 4 5 中序遍歷 3 1 2 4 5 前序遍歷 分析可得二叉樹如下圖 3 1 4 2 5 3的左子樹計算1 7 5 12 3的右子樹計算1 10 2 12...

NOIP 2003 加分二叉樹

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