OBST

PHOTO EMBED

Wed Nov 06 2024 16:41:01 GMT+0000 (Coordinated Universal Time)

Saved by @signin

import java.util.Scanner;

public class OptimalBinarySearchTree {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Input number of keys
        System.out.print("Enter the number of keys: ");
        int n = scanner.nextInt();

        // Input keys
        int[] keys = new int[n];
        System.out.println("Enter the keys:");
        for (int i = 0; i < n; i++) {
            keys[i] = scanner.nextInt();
        }

        // Input probabilities for each key
        double[] probabilities = new double[n];
        System.out.println("Enter the probabilities for each key:");
        for (int i = 0; i < n; i++) {
            probabilities[i] = scanner.nextDouble();
        }

        // Calculate minimum cost of Optimal BST
        double minCost = optimalBST(keys, probabilities, n);

        System.out.println("Minimum cost of Optimal BST: " + minCost);

        scanner.close();
    }

    public static double optimalBST(int[] keys, double[] probabilities, int n) {
        double[][] cost = new double[n + 1][n + 1];
        double[][] sumProb = new double[n + 1][n + 1];

        // Initialize the cost for a single key
        for (int i = 0; i < n; i++) {
            cost[i][i] = probabilities[i];
            sumProb[i][i] = probabilities[i];
        }

        // Fill cost and sumProb matrices for increasing chain lengths
        for (int length = 2; length <= n; length++) {
            for (int i = 0; i <= n - length; i++) {
                int j = i + length - 1;
                cost[i][j] = Double.MAX_VALUE;
                sumProb[i][j] = sumProb[i][j - 1] + probabilities[j];

                // Find the minimum cost with different roots
                for (int r = i; r <= j; r++) {
                    double c = (r > i ? cost[i][r - 1] : 0) +
                               (r < j ? cost[r + 1][j] : 0) +
                               sumProb[i][j];
                    if (c < cost[i][j]) {
                        cost[i][j] = c;
                    }
                }
            }
        }

        return cost[0][n - 1];
    }
}
content_copyCOPY