動態規劃入門之最優二叉搜尋樹

2021-09-26 00:00:43 字數 2179 閱讀 6952

解決此題的方法有兩種,一種是樹形dp,一種是記憶化搜尋 在此會給出兩種

矩陣的方法參照圖:

樹形dp

//這裡首先將分數填入到f矩陣中,root矩陣儲存有按順序排好的節點值

for(

int i =

1; i <= n; i++

)for

(int len =

1; len < n; len++)}

}}

記憶化搜尋
int

dfs(

long

long left,

long

long right)

}return f[left]

[right]

;}

樹形dp完整**
#include

#include

#include

using namespace std;

//節點個數

long

long n;

long

long f[50]

[50], root[50]

[50];

//這裡由於矩陣擺放的位置有點奇怪,具體要看演算法導論第229-230頁

void

print

(long

long left,

long

long right)

printf

("%lld "

,root[left]

[right]);

print

(left, root[left]

[right]-1

);print

(root[left]

[right]+1

, right);}

intmain()

for(

int len =

1; len < n; len++)}

}}printf

("%lld\n"

,f[1

][n]);

print(1

, n)

;system

("pause");

return0;

}

記憶化搜尋完整**
#include

#include

#include

using namespace std;

//節點個數

long

long n;

long

long f[50]

[50]=

, root[50]

[50]=

;//這裡由於矩陣擺放的位置有點奇怪,具體要看演算法導論第229-230頁

void

print

(long

long left,

long

long right)

printf

("%lld "

, root[left]

[right]);

print

(left, root[left]

[right]-1

);print

(root[left]

[right]+1

, right);}

intdfs

(long

long left,

long

long right)

}return f[left]

[right];}

intmain()

printf

("%d\n"

,dfs(1

, n));

print(1

, n)

;system

("pause");

return0;

}

動態規劃之最優二叉搜尋樹

在看這張之前,最好看看我寫的 動態規劃詳解 裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。給定乙個由n個互異的關鍵字組成的序列k k1,k2,kn 且關鍵字有序 因此有k1 k2 kn 從這些關鍵字中構造一棵二叉查詢樹。對每個關鍵字ki,一次搜尋為ki的概率是pi。某些搜尋的值可能不在k內,...

動態規劃之最優二叉搜尋樹

最優二叉搜尋樹簡介 舉例以及詳細分析 塊測試結果 1 概念引入 基於統計先驗知識,我們可統計出乙個數表 集合 中各元素的查詢概率,理解為集合各元素的出現頻率。比如中文輸入法字型檔中各詞條 單字 片語等 的先驗概率,針對使用者習慣可以自動調整詞頻 所謂動態調頻 高頻先現原則,以減少使用者翻查次數。這就...

動態規劃之最優二叉搜尋樹

最優二叉搜尋樹 public class optimalbst k1.k5的概率 private double q d1.d5的概率 public static void main string args public optimalbst 計算得到最優二叉搜尋樹期望代價 private void ...