optimal binary search tree using dynamic programming