Good basic DP lecture for someone who need basic understanding like me:

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/lecture-19-dynamic-programming-i-fibonacci-shortest-paths/

```
def __init__(self):
self.stairTable = {1:1, 2:2}
def climbStairs(self, n):
# s(n) = s(n-1) + s(n-2)
if n not in self.stairTable:
self.stairTable[n] = self.climbStairs(n-1) + self.climbStairs(n-2)
return self.stairTable[n]
```