1.算法讲解见《算法设计与分析基础》P223-P227;
2.关于如何确定循环的值,见下图:
可得到下表:
很显然,d作为最外层循环,i为次外层,而j作为i的因变量存在。
i=1~(n-d),相应的j= i+d 。
k作为最内存循环,每次开始循环时,始终用temp存储此次循环的最小值,即
3.代码如下:
#include<stdio.h>
#include<stdlib.h>
#define max 9999
void OptimalBST(int num,float*p,float**c,int**r)
{
int d,i,j,k,s;
float temp,sum;
for(i=1;i<num+1;i++) //主表和根表元素的初始化
{
c[i][i-1]=0; //C对角元
c[i][i]=p[i]; //C次对角元
r[i][i]=i; //R次对角元
}
c[num+1][num]=0; //C对角线上的最后一个元素(上面的循环赋值不到的)
for(d=1;d<=num-1;d++) //加入节点序列
{
for(i=1;i<=num-d;i++)
{
j=i+d; //j是关于i和d的因变量,无需单独一层循环
temp=max;
for(k=i;k<=j;k++)//找最优根
{
if(c[i][k-1]+c[k+1][j]<temp) //递推公式
{
temp=c[i][k-1]+c[k+1][j];
r[i][j]=k; //记录最优根
}
}
sum=p[i];
for(s=i+1;s<=j;s++)
sum+=p[s];
c[i][j]=temp+sum;
}
}
}
4.参考资料
http://www.cnblogs.com/lpshou/archive/2012/04/26/2470914.html
http://wenku.baidu.com/link?url=MRNCCBSQgC3QzGw2FFUzYdxfMfuRyMeG-FApG5UDvgrdmZYg4lp1xaKWR_xxabhdK6tiUwTegvIyRgR9w1BA58DW0onYZ-W7d5HmsgVYgKS
《算法设计与分析基础》P223-P227;