解決此題的方法有兩種,一種是樹形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 ...