算法导论第三版15-5-2:最优二叉搜索树算法C实现

#include<stdio.h>
//代码为算法导论p229页算法实现
#define LENGTH 7
int main(void) {
	double p[8] = { 0,   0.04,0.06,0.08,0.02,0.10,0.12,0.14 };
	double q[8] = { 0.06,0.06,0.06,0.06,0.05,0.05,0.05,0.05 };
	double e[LENGTH + 2][LENGTH + 1] = { 0 }; //declare e[1...LENGTH+1][0...LENGTH]
	double w[LENGTH + 2][LENGTH + 1] = { 0 };//declare w[1...LENGTH+1][0...LENGTH]
	int root[LENGTH + 1][LENGTH + 1] = { 0 };
	for (int i = 1; i <= LENGTH + 1; i++)
	{
		e[i][i - 1] = q[i - 1];
		w[i][i - 1] = q[i - 1];
	}
	for (int l = 1; l <= LENGTH; l++)
	{
		for (int i = 1; i <= LENGTH - l + 1; i++)
		{
			int j = i + l - 1;
			e[i][j] = 1000;
			w[i][j] = w[i][j - 1] + p[j] + q[j];
			for (int r = i; r <= j; r++)
			{
				double t = e[i][r - 1] + e[r + 1][j] + w[i][j];
				if (t < e[i][j]) {
					e[i][j] = t;
					root[i][j] = r;
				}
			}
		}
	}

	printf("e:\n");
	for (int i = 1; i <= LENGTH + 1; i++)
	{
		for (int j = 0; j <= LENGTH; j++)
		{
			printf("%f\t", e[i][j]);
		}
		printf("\n");
	}
	printf("w:\n");
	for (int i = 1; i <= LENGTH + 1; i++)
	{
		for (int j = 0; j <= LENGTH; j++)
		{
			printf("%f\t", w[i][j]);
		}
		printf("\n");
	}
	printf("root:\n");
	for (int i = 1; i <= LENGTH; i++)
	{
		for (int j = 1; j <= LENGTH; j++)
		{
			printf("%d\t", root[i][j]);
		}
		printf("\n");
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值