2021-02-26:配列arrは、バイナリツリーの順序どおりの走査の結果であり、各エッジのコストは、常に開いている親ノードと子ノードの積です。

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
    }
}

実行結果は以下のとおりです。
ここに画像の説明を挿入


コメント

おすすめ

転載: blog.51cto.com/14891145/2639839