动态规划——最优二叉查找树

大年夜,中午在姑姑家喝了些酒,头有些疼,晕乎乎的只想睡觉,还以为是酒精的力量,晚上在干妈家吃饭,愈发难受,意识到应该是感冒了,草草吃了些,就回家磕了点药睡觉,闹钟拨到11点,春晚就拜拜了,但岁还得守,老祖宗的规矩可不能破,^-^
最优二叉查找树
e[i][j]的值是在最优二叉查找树中的期望搜索代价。为有助于记录最优二叉查找树的结构,定义root[i][j]为k[r]的下标r,对1 <= i <= j <= n,k[r]是包含关键字k[i], ... , k[j]的一棵最优二叉查找树的根。
e[i][j] = q[i-1]    if (j = i - 1)
e[i][j] = min(i <= r <= j){e[i][r-1] + e[r+1][j] + w[i][j]}  if (i <= j)
w[i][j] = w[i][j-1] + p[j] + q[j]

Main.c

#include  < stdio.h >
#include 
< string .h >
#include 
< limits.h >
#define  MAXLEN 100

void  OptimalBST( float   * p,  float   * q,  int  n,  double  e[][MAXLEN],  int  root[][MAXLEN])
{
    
int i, j, L, t, r;
    
float w[MAXLEN][MAXLEN];
    
    
for(i = 1; i <= n + 1; i++)
    
{
        e[i][i
-1= q[i-1];
        w[i][i
-1= q[i-1];
    }

    
for(L = 1; L <= n; L++)
    
{
        
for(i = 1; i <= n-L+1; i++)
        
{
            j 
= i + L - 1;
            e[i][j] 
= INT_MAX;
            w[i][j] 
= w[i][j-1+ p[j] + q[j];
            
for(r = i; i <= j; i++)
            
{
                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;
                }

            }

        }

    }

}


int  main( int  argc,  char   ** argv)
{
    
float p[MAXLEN] = {0.000.150.100.050.100.20};
    
float q[MAXLEN] = {0.050.100.050.050.050.10};
    
double e[MAXLEN][MAXLEN];
    
int root[MAXLEN][MAXLEN];
    
int n;

    n 
= 5;
    
    OptimalBST(p, q, n, e, root);
    
    
return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值