Algorithm design and analysis dynamic programming