参考程序:
http://blog.csdn.net/xiajun07061225/article/details/8088784
#include <iostream>
#include<iomanip>
using namespace std;
const int MaxVal = 9999;
const int n = 5;
//搜索到根节点和虚拟键的概率
double p[n + 1] = {-1,0.15,0.1,0.05,0.1,0.2};
double q[n + 1] = {0.05,0.1,0.05,0.05,0.05,0.1};
int root[n + 1][n + 1];//记录根节点
double w[n + 2][n + 2];//子树概率总和
double e[n + 2][n + 2];//子树期望代价
double optimalBST2(int low, int high)
{
if( low - high == 1 )
return q[high];
else
{
double minMal = MaxVal;
double temp = 0;
for(int k = low; k <= high; k++)
{
double prob = 0;
for( int index = low; index <= high; index++ )
prob = prob + p[index] + q[index];
prob = prob + q[low-1];
temp = optimalBST2(low,k-1) + optimalBST2(k+1,high) + p[k] + prob;
if( temp < minMal )
{
minMal = temp;
root[low][high] = k;
}
}
return temp;
}
}
void printOptimalBST2(int low, int high, int indent)
{
if( low < 0 || high > 5 || high < low)
return;
if( low == high )
{
cout << setw(indent+8) << "d" << low << endl;
cout << setw(indent) << "k" << low << endl;
cout << setw(indent+8) << "d" << low-1 << endl;
}
else
{
int pivot = root[low][high];
printOptimalBST2( pivot + 1, high, indent + 8);
if( pivot == high )
cout << setw(indent+8) << "d" << pivot << endl;
cout << setw(indent) << "k" << pivot << endl;
printOptimalBST2( low, pivot - 1, indent+8);
}
}
int main()
{
optimalBST2(1,5);
printOptimalBST2(1,5,0);
return 0;
}