引言
写完矩阵链相乘问题接着写最优二叉搜索树问题,感觉在动态规划方程的结构上二者并没有太多的本质区别,但是最优二叉搜索树问题难在方程的推导过程,并且还有辅助数组。
输入
第一行为一个数n,表示有n个关键字
第二行为n个数,表示这n个关键字的权重
第三行为n + 1个数,表示n + 1个伪关键字的权重
输出
最优二叉搜索树的搜索期望,即所有结点值与对应权重(深度 + 1)的乘积的和值
动态转移方程
其中
循环顺序
for(int l = 1;l <= n;l++)//包含节点个数
for(int i = 1;i <= n - l + 1;i++)//左边界
int j = i + l - 1;//右边界
for(int r = i;r <= j;r++)//第r个作为根节点
初始化
void init(){
for(int i = 0;i <= n + 1;i++){
for(int j = 0;j <= n + 1;j++){
w[i][j] = root[i][j] = 0;
e[i][j] = INT_MAX;
}
}
for(int i = 1;i <= n + 1;i++){
e[i][i - 1] = q[i - 1];
w[i][i - 1] = q[i - 1];
}
}
结果获取
void print(){
printf("%.3lf\n", e[1][n]);
}