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