2021-02-26:配列arrは、バイナリツリーの順序どおりの走査の結果です。各エッジのコストは親ノードと子ノードの積であり、合計コストはコストの合計です。すべてのエッジの。最小総費用はいくらですか?
リンク:https
://www.nowcoder.com/questionTerminal/0d939e874a004f449a370aca1346dd5c出典:Niuke.com
小グループにはN個のノードで構成される二分木があり、各ノードには重みがあります。二分木の各エッジのコストを両端のノードの重みの積として定義します。二分木の総コストは、各エッジのコストの合計です。小グループは、二分木の中間次走査に従って各ノードの重みを順番に記録します。つまり、彼はN個の数を記録し、i番目の数はのi番目の位置にあるノードの重みを表します。ミドルオーダートラバーサル。その後、何らかの理由で、Xiaotuanは二分木の特定の構造を忘れました。考えられるすべての二分木のうち、総コストが最小の二分木は最適二分木と呼ばれます。ここで、XiaoTuanはXiaoMeiに最適な二分木の総コストを見つけるように依頼します。
入力の説明:
最初の行に整数N(1 <= N <= 300)を入力します。これは、バイナリツリーのノード数を表します。
2行目にスペースで区切ってN個の整数を入力します。これは、トラバーサルレコードの各ノードの重みを中間順に意味し、所有権の値はすべて1000を超えない正の整数です。
出力の説明:
最適な二分木の総コストを表す整数を出力します。
フーゲの答え2021-02-26:
自然の知恵で十分です。
1.再帰。コードがあります。
2.メモリ検索。コードがあります。
コードはgolangで記述されており、コードは次のとおりです。
package main
import "fmt"
const MAX = int(^uint(0) >> 1)
//https://www.nowcoder.com/questionTerminal/0d939e874a004f449a370aca1346dd5c
func main() {
arr := []int{7, 6, 5, 1, 3}
ret := f1(arr)
fmt.Println("1.递归:", ret)
ret = f2(arr)
fmt.Println("2.记忆化搜索:", ret)
}
func f1(arr []int) int {
arrLen := len(arr)
if arrLen <= 1 {
return 0
}
return process1(arr, -1, 0, arrLen-1)
}
func process1(arr []int, cur int, L int, R int) int {
length := R - L + 1
if length == 0 {
return 0
}
ans := MAX
for i := L; i <= R; i++ {
temp := 0
if cur >= 0 {
temp = arr[cur] * arr[i]
}
ans = getMin(temp+process1(arr, i, L, i-1)+process1(arr, i, i+1, R), ans)
}
return ans
}
func f2(arr []int) int {
arrLen := len(arr)
if arrLen <= 1 {
return 0
}
dp := make([][][]int, arrLen+1)
for i := 0; i < arrLen+1; i++ {
dp[i] = make([][]int, arrLen)
for j := 0; j < arrLen; j++ {
dp[i][j] = make([]int, arrLen)
for k := 0; k < arrLen; k++ {
dp[i][j][k] = -1
}
}
}
ret := process2(arr, -1, 0, arrLen-1, dp)
//fmt.Println(dp)
return ret
}
func process2(arr []int, cur int, L int, R int, dp [][][]int) int {
length := R - L + 1
if length == 0 {
return 0
}
if dp[cur+1][L][R] != -1 {
//fmt.Println("记忆化", dp[cur+1][L][R])
return dp[cur+1][L][R]
}
ans := MAX
for i := L; i <= R; i++ {
temp := 0
if cur >= 0 {
temp = arr[cur] * arr[i]
}
ans = getMin(temp+process2(arr, i, L, i-1, dp)+process2(arr, i, i+1, R, dp), ans)
}
dp[cur+1][L][R] = ans
return ans
}
func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
}
実行結果は以下のとおりです。