动态规划之 最优二叉搜索数 递归实现


参考程序:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值