算法导论 15章(1)最优二叉搜索树
2015-06-03 19:17
465 查看
#include <iostream> #include <vector> using namespace std; class Result { public: Result(int n) { num = n+2; e = new double *[n+2]; root = new int *[n+2]; w = new double *[n+2]; for(int i=0; i<=n+1; i++) { e[i] = new double [n+2]; root[i] = new int [n+2]; w[i] = new double [n+2]; } /****************test******************* for(i = 0; i<num; i++) for(int j=0; j<num; j++) { e[i][j] = i+j; root[i][j] =i+j; } ***************test********************/ } void Print() { for(int i = 0; i<num; i++) { for(int j = 0; j<num; j++) { cout << e[i][j] << " " ; } cout << endl; } cout << endl; for(i = 0; i<num; i++) { for(int j = 0; j<num; j++) { cout << root[i][j] << " " ; } cout << endl; } } void set_w(int i, int j, double num) { w[i][j] = num; } void set_e(int i, int j, double num) { e[i][j] = num; } void set_root(int i, int j, int num) { root[i][j] = num; } double get_w(int i, int j) { return w[i][j]; } double get_e(int i, int j) { return e[i][j]; } int get_root(int i, int j) { return root[i][j]; } private: double **w; //保存概率 double **e; //保存BST的查找期望 int **root; //保存BST的节点信息 int num; //保存数组规模 }; Result OPTIMAL_BST(const vector<double> &p, const vector<double> &q, const int &n) { //p中的有效元素只有n个,第0个元素是填充的 //q中的有效元素有n+1个 //这里的n指的是查找节点的个数 Result res(n); for(int i = 1; i<=n+1; i++) { res.set_w(i, i-1, q[i-1]); res.set_e(i, i-1, q[i-1]); } for(int l = 1; l <= n; l++) for(int i = 1; i <= n-l+1; i++) { int j = i+l-1; res.set_e(i, j, 99999); res.set_w(i, j, (res.get_w(i, j-1))+p[j]+q[j]); // w[i][j] = w[i][j-1]+p[j]+q[j] for(int r = i; r<=j; r++) { double tmp = res.get_e(i, r-1)+res.get_e(r+1, j)+res.get_w(i, j); if(tmp < res.get_e(i, j)) { res.set_e(i, j, tmp); res.set_root(i, j, r); } } } return res; } //打印节点的函数 void Print(Result res, int i, int j, int flag) { if(flag == 1) { cout << "k" <<res.get_root(i, j) << "是根节点" << endl; flag = 0; } int r = res.get_root(i, j); //如果左子树是叶子 if(i>r-1) { //当i比r-1大时,左子树是叶子了,即为d的节点,此时d的下标就是r-1 cout << "d" << r-1 << "是" << "k" << r << "的左孩子" << endl; } //如果左子树不是叶子 else { cout << "k" << res.get_root(i, r-1) << "是" << "k" << r << "的左孩子" << endl; Print(res, i, r-1, 0); } //如果右子树是叶子 if(j<r+1) { cout << "d" << j << "是" << "k" << r << "的左孩子" << endl; } //如果左子树不是叶子 else { cout << "k" << res.get_root(r+1, j) << "是" << "k" << r << "的左孩子" << endl; Print(res, r+1, j, 0); } } int main() { int n; // cin >> n; // Result res(n); vector<double> v1; vector<double> v2; v1.push_back(0); v1.push_back(0.15); v1.push_back(0.10); v1.push_back(0.05); v1.push_back(0.10); v1.push_back(0.20); v2.push_back(0.05); v2.push_back(0.10); v2.push_back(0.05); v2.push_back(0.05); v2.push_back(0.05); v2.push_back(0.10); Result res(v1.size()-1); res = OPTIMAL_BST(v1, v2, v1.size()-1); cout << res.get_e(1, 5) << endl; Print(res, 1, 5, 1); return 0; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- java算法导论之FloydWarshall算法实现代码
- C++ 动态规划
- Red-Black Tree 的Java实现
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 逆序对
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- 算法导论之堆
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- USACO 3.2.2:Stringsobits
- 字符串编辑距离