package com.interview.dynamic; /** * http://www.geeksforgeeks.org/dynamic-programming-set-24-optimal-binary-search-tree/ */ public class OptimalTreeSearch { public int minCostRec(int input[],int freq[]){ return minCostRec(input,freq,0,input.length-1,1); } private int minCostRec(int input[],int freq[],int low,int high,int level){ if(low > high){ return 0; } int min = Integer.MAX_VALUE; for(int i=low; i <= high; i++){ int val = minCostRec(input,freq,low,i-1,level+1) + minCostRec(input,freq,i+1,high,level+1) + level*freq[i]; if(val < min){ min = val; } } return min; } public int minCost(int input[], int freq[]){ int T[][] = new int[input.length][input.length]; for(int i=0; i < T.length; i++){ T[i][i] = freq[i]; } for(int l = 2; l <= input.length; l++){ for(int i=0; i <= input.length-l; i++){ int j = i + l -1; T[i][j] = Integer.MAX_VALUE; int sum = getSum(freq, i, j); for(int k=i; k <= j; k++){ int val = sum + (k-1 < i ? 0 : T[i][k-1]) + (k+1 > j ? 0 : T[k+1][j]) ; if(val < T[i][j]){ T[i][j] = val; } } } } return T[0][input.length-1]; } private int getSum(int freq[], int i, int j){ int sum = 0; for(int x = i; x <= j; x++){ sum += freq[x]; } return sum; } public static void main(String args[]){ int input[] = {10,12,20,35,46}; int freq[] = {34,8,50,21,16}; OptimalTreeSearch ots = new OptimalTreeSearch(); System.out.println(ots.minCost(input, freq)); System.out.println(ots.minCostRec(input, freq)); } }