Videos I find useful.
https://www.youtube.com/playlist?list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb
https://courses.csail.mit.edu/6.006/spring11/exams/notes3-dp
Ultimately from what I've understood from the MIT lectures, there are 5 steps to really solving a DP.
- Figure out how many sub problems there are
- Guess how to solve the sub problems.
- Relate the subproblems to solutions
- Find a recursive algorithm which solves the sub problems
- Solve the original problem.
Sub problems typically break down into 3 variations.
prefix which means it makes sense to start from the beginning of the 'list' and work forwards (correct?) so for this case doing fibbonacci it doesn't make sense to start with the nth value and work backwards because you don't know n, you don't know n-1... you know 0, so start with 0. (I think this makes sense?)
suffix which means it makes sense to start from the end of the 'list' and work backwards (correct?) sometimes the later values need to be considered
http://jeffe.cs.illinois.edu/teaching/algorithms/
https://www.youtube.com/watch?v=Qx_Nbv0bhfI
https://www.youtube.com/watch?v=wXGrolB-So8
https://www.youtube.com/watch?v=SyeHo630M_w&feature=youtu.be&t=366
https://www.youtube.com/watch?v=HBqJ_vn6Afs
(old) https://8803ga.wordpress.com/lecture-schedule/
https://gt-algorithms.com/spring18/
http://www.freetechbooks.com/index.php/algorithms-t311.html
http://books.goalkicker.com/AlgorithmsBook/
http://www.cse.iitd.ernet.in/~ssen/csl356/notes/root.pdf
https://www.geeksforgeeks.org/fundamentals-of-algorithms/#DynamicProgramming
https://www.quora.com/How-can-one-start-solving-dynamic-programming-problems
https://www.hackerrank.com/domains/algorithms/dynamic-programming
https://leetcode.com/tag/dynamic-programming/
http://cooervo.github.io/Algorithms-DataStructures-BigONotation/
http://jeffe.cs.illinois.edu/teaching/algorithms/notes/99-recurrences.pdf