https://gyunseo.com/posts/dynamic-programming/