fibonacci dynamic programming complexity
time: O(n)
matrix chain multiplication – DP
time: O(n^3)
knapsack – DP
time: O(nW), number of items * max_weight
space: also O(nW)
longest common subsequence – dp
O(nm), length of first string * length of second string