Optimal decision tree using dynamic programming