日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

加分二叉树 java_P1040 加分二叉树

發(fā)布時(shí)間:2024/1/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 加分二叉树 java_P1040 加分二叉树 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P1040 加分二叉樹

題目描述

設(shè)一個(gè)n個(gè)節(jié)點(diǎn)的二叉樹tree的中序遍歷為(1,2,3,…,n),其中數(shù)字1,2,3,…,n為節(jié)點(diǎn)編號(hào)。每個(gè)節(jié)點(diǎn)都有一個(gè)分?jǐn)?shù)(均為正整數(shù)),記第i個(gè)節(jié)點(diǎn)的分?jǐn)?shù)為di,tree及它的每個(gè)子樹都有一個(gè)加分,任一棵子樹subtree(也包含tree本身)的加分計(jì)算方法如下:

subtree的左子樹的加分× subtree的右子樹的加分+subtree的根的分?jǐn)?shù)。

若某個(gè)子樹為空,規(guī)定其加分為1,葉子的加分就是葉節(jié)點(diǎn)本身的分?jǐn)?shù)。不考慮它的空子樹。

試求一棵符合中序遍歷為(1,2,3,…,n)且加分最高的二叉樹tree。要求輸出;

(1)tree的最高加分

(2)tree的前序遍歷

輸入輸出格式

輸入格式:

第1行:一個(gè)整數(shù)n(n<30),為節(jié)點(diǎn)個(gè)數(shù)。

第2行:n個(gè)用空格隔開的整數(shù),為每個(gè)節(jié)點(diǎn)的分?jǐn)?shù)(分?jǐn)?shù)<100)。

輸出格式:

第1行:一個(gè)整數(shù),為最高加分(結(jié)果不會(huì)超過4,000,000,000)。

第2行:n個(gè)用空格隔開的整數(shù),為該樹的前序遍歷。

輸入輸出樣例

輸入樣例#1:

5

5 7 1 2 10

輸出樣例#1:

145

3 1 2 4 5

分析:

二叉樹的中序遍歷是把根節(jié)點(diǎn)放在中間

換而言之就是把根節(jié)點(diǎn)左右兩邊的樹形序列(子樹)合并起來(lái)

那決策點(diǎn)就是根節(jié)點(diǎn)

那么很明顯這道題就是一個(gè)合并類的區(qū)間DP了

和石子合并思路相同,需要注意的是初始狀態(tài)必須為1(因?yàn)槭窍喑?,不然結(jié)果會(huì)出錯(cuò)

dp[i][j]表示中序遍歷i到j(luò)最大值

方程:dp[i,j]:=max(dp[i][k-1]*dp[k+1][j]+dp[k][k]

1 #include

2 #include

3 #include

4

5 #define N 101

6

7 using namespacestd;8 intn,num[N][N];9 long longf[N][N];10

11 void find(int x,inty)12 {13 if(x<=y)14 {15 printf("%d",num[x][y]);16 find(x,num[x][y]-1);17 find(num[x][y]+1,y);18 }19 }20

21 intmain()22 {23 scanf("%d",&n);24 //f用來(lái)dp,num用來(lái)記錄路徑

25 for(int i=0;i<=n;i++) for(int j=0;j<=n;j++)26 {27 //初始時(shí)把每個(gè)節(jié)點(diǎn)都看做是葉子節(jié)點(diǎn)28 //初始時(shí)把每個(gè)節(jié)點(diǎn)的根都看出是自己

29 f[i][j]=1;num[i][i]=i;30 }31 //輸入節(jié)點(diǎn) 歷i到i的值就是葉子節(jié)點(diǎn)的值

32 for(int i=1;i<=n;i++) scanf("%d",&f[i][i]);33 //區(qū)間DP合并石子的一種寫法里面的

34 for(int i=n;i>=1;i--)35 for(int j=i+1;j<=n;j++)36 for(int k=i;k<=j;k++)37 {38 if(f[i][j]

41 num[i][j]=k;42

43 }44 printf("%lld\n",f[1][n]);find(1,n);45 return 0;46 }

總結(jié)

以上是生活随笔為你收集整理的加分二叉树 java_P1040 加分二叉树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。