標籤:color 計算 const == 整數 tput 程式 ane com
題目描述 Description
設一個n個節點的二叉樹tree的中序遍曆為(l,2,3,…,n),其中數字1,2,3,…,n為節點編號。每個節點都有一個分數(均為正整數),記第j個節點的分數為di,tree及它的每個子樹都有一個加分,任一棵子樹subtree(也包含tree本身)的加分計算方法如下:
subtree的左子樹的加分× subtree的右子樹的加分+subtree的根的分數
若某個子樹為主,規定其加分為1,葉子的加分就是分葉節點本身的分數。不考慮它的空
子樹。
試求一棵符合中序遍曆為(1,2,3,…,n)且加分最高的二叉樹tree。要求輸出;
(1)tree的最高加分
(2)tree的前序走訪
現在,請你協助你的好朋友XZ設計一個程式,求得正確的答案。
輸入描述 Input Description
第1行:一個整數n(n<=30),為節點個數。
第2行:n個用空格隔開的整數,為每個節點的分數(分數<=100)
輸出描述 Output Description
第1行:一個整數,為最高加分(結果不會超過4,000,000,000)。
第2行:n個用空格隔開的整數,為該樹的前序走訪。
範例輸入 Sample Input
5
5 7 1 2 10
範例輸出 Sample Output
145
3 1 2 4 5
資料範圍及提示 Data Size & Hint
n(n<=30)
分數<=100
code
#include<stdio.h>#include<algorithm>using namespace std;const int MX=101;int n,f[MX][MX],root[MX][MX];int serch(int l,int r) { int k,now,ans; if(l>r) return 1; if(f[l][r]==-1) for(k=l;k<=r;++k) { now=serch(l,k-1)*serch(k+1,r)+f[k][k]; if(now>f[l][r]) { f[l][r]=now; root[l][r]=k; } } return f[l][r];}bool flag=1;void dfs(int l,int r) { if(l>r) return ; if(flag) flag=0; else printf(" "); printf("%d",root[l][r]); dfs(l,root[l][r]-1); dfs(root[l][r]+1,r);}int main() { scanf("%d",&n); for(int i=1;i<=n;++i) for(int j=i;j<=n;++j) f[i][j]=-1; for(int i=1;i<=n;++i) { scanf("%d",&f[i][i]); root[i][i]=i; } printf("%d\n",serch(1,n)); dfs(1,n); return 0;}
加分二叉樹(codevs 1090)