最优二叉树的搜索期望代价

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <memory.h>
using namespace std;
double p[25],q[25],dp[25][25],pp[25][25];

int main()
{
    int n;
    while (scanf("%d",&n)!=EOF){
    for (int i=1;i<=n;i++)
        scanf("%lf",&p[i]);
    for (int i=0;i<=n;i++)
        scanf("%lf",&q[i]);

        memset(pp,0,sizeof(pp));
        memset(dp,0,sizeof(dp));

    for (int i=1;i<=n+1;i++)
    {
        pp[i][i-1]=q[i-1];
        for (int j=i;j<=n;j++)
            pp[i][j]=pp[i][j-1]+p[j]+q[j];
    }

    for (int i=1;i<=n+1;i++)
        dp[i][i-1]=q[i-1];

    for (int l=1;l<=n;l++)
    {
        for (int s=1;s+l-1<=n;s++)
        {
            int ten=s+l-1;
            dp[s][ten]=999999.0;
            
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个求解最优二叉树的Java代码,带有详细的注释说明: ```java /** * 求最优二叉树的类 */ public class OptimalBinarySearchTree { /** * 计算最优二叉树的方法 * @param p 各个节点的概率 * @param q 虚拟节点的概率 * @param n 节点个数 * @return 最优二叉树期望代价 */ public static double optimalBinarySearchTree(double[] p, double[] q, int n) { // e[i][j]表示包含p[i..j]的最优二叉树期望代价,w[i][j]表示p[i..j]以及q[i-1..j]的概率之和 double[][] e = new double[n+2][n+1], w = new double[n+2][n+1]; for (int i = 1; i <= n+1; i++) { e[i][i-1] = q[i-1]; w[i][i-1] = q[i-1]; } for (int len = 1; len <= n; len++) { for (int i = 1; i <= n-len+1; i++) { int j = i + len - 1; e[i][j] = Double.MAX_VALUE; 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; } } } } return e[1][n]; } /** * 测试最优二叉树的方法 */ public static void main(String[] args) { double[] p = {0.15, 0.10, 0.05, 0.10, 0.20}; double[] q = {0.05, 0.10, 0.05, 0.05, 0.05, 0.10}; int n = p.length; double e = optimalBinarySearchTree(p, q, n); System.out.println("最优二叉树期望代价为:" + e); } } ``` 注释: 1. 计算最优二叉树的方法是 `optimalBinarySearchTree`,这个方法接收三个参数:`p`是一个长度为`n`的浮点数组,表示每个节点的概率;`q`是一个长度为`n+1`的浮点数组,表示每个虚拟节点的概率;`n`是节点总数。 2. 在方法内部,我们首先定义了两个二维数组 `e` 和 `w`,分别用来记录包含某个子树的最优二叉树期望代价和概率之和。 3. 在`for`循环中,我们先初始化 `e[i][i-1]` 和 `w[i][i-1]` 的值,这是因为当子树为空时,最优二叉树期望代价和概率都是虚拟节点的概率。 4. 之后的 `for` 循环中,我们使用动态规划的思路来计算每个子树的最优二叉树期望代价。对于每个子树 `p[i..j]`,我们枚举其中任意一个节点 `r`,假设以这个节点为根节点,它的左子树是 `p[i..r-1]`,右子树是 `p[r+1..j]`,那么最优二叉树期望代价就是左右子树的期望代价加上根节点的期望代价以及它们出现的概率之和。 5. 最后返回 `e[1][n]`,即包含所有节点的最优二叉树期望代价。 6. 在 `main` 方法中,我们先定义了节点概率和虚拟节点概率的数组,然后调用 `optimalBinarySearchTree` 方法来求解最优二叉树期望代价,最后打印出结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值