What is the difference between dynamic programming and divide and conquer? I have solved around 150 problems on dynamic programming, but I still fail to recognize the optimal substructure for most problems. How to improve?