Idea: Do all the problems that you can. Then collect them together and draw whatever you need.
Problem List extracted
https://leetcode.com/studyplan/dynamic-programming/
- Grab all the problems here (together with the drawings.) and use them to create the pseudocode's later.
- Time it. Try to get them fast.
## Ideas for the future:
- Run experimentation where
## Problems
I
### Fibonacci Number
https://leetcode.com/problems/fibonacci-number/?envType=study-plan-v2&envId=dynamic-programming
3:51
```py
class Solution:
def fib(self, n: int) -> int:
if n==0:
return 0
if n <= 2:
return 1
prev = 1
prev2 = 1
for _ in range(n-2):
temp = prev + prev2
prev2 = prev
prev = temp
return prev
```
### N-th Tribonacci Number
https://leetcode.com/problems/n-th-tribonacci-number/description/?envType=study-plan-v2&envId=dynamic-programming
3:40
```python=
class Solution:
def tribonacci(self, n: int) -> int:
if n ==0:
return 0
elif n<=2:
return 1
prev = 1
prev2 = 1
prev3 = 0
for _ in range(n-2):
res = prev + prev2 + prev3
prev3 = prev2
prev2 = prev
prev = res
return prev
```
### 746. Min Cost Climbing Stairs
https://leetcode.com/problems/min-cost-climbing-stairs/description/?envType=study-plan-v2&envId=dynamic-programming
```python=
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
prevMin = 0
prevMin2 = 0
for _cost in cost:
res = min(prevMin, prevMin2) + _cost
prevMin2 = prevMin
prevMin = res
return min(prevMin, prevMin2)
```
### 198. House Robber
https://leetcode.com/problems/house-robber/description/?envType=study-plan-v2&envId=dynamic-programming
3:45
```python=
class Solution:
def rob(self, nums: List[int]) -> int:
prev = 0
prev2 = 0
for num in nums:
rob = max(prev2 + num, prev)
prev2 = prev
prev = rob
return prev
```
### 740. Delete and Earn
https://leetcode.com/problems/delete-and-earn/description/?envType=study-plan-v2&envId=dynamic-programming
```python
class Solution:
def deleteAndEarn(self, nums: List[int]) -> int:
count = {}
for num in nums:
if num not in count:
count[num] = 1
else:
count[num] += 1
sortedNums = list(count.keys())
sortedNums.sort()
for num in range(sortedNums[0], sortedNums[-1]+1):
prevMax = maxes[num-1] if (num-1) in maxes else 0
prev2Max = maxes[num-2] if (num-2) in maxes else 0
if num not in count:
latest = max(prevMax, prev2Max)
else:
latest = max(prevMax, prev2Max + count[num] * num)
maxes[num] = latest
return latest
```
> This one at least a more interesting question here.
Using just prev and prev2
```python
class Solution:
def deleteAndEarn(self, nums: List[int]) -> int:
count = {}
for num in nums:
if num not in count:
count[num] = 1
else:
count[num] += 1
sortedNums = list(count.keys())
sortedNums.sort()
prev = 0
prev2 = 0
prev = 0
prev2 = 0
for num in range(sortedNums[0], sortedNums[-1] + 1):
if num in count:
current = max(prev, prev2 + count[num] * num)
else:
current = prev
prev2 = prev
prev = current
return prev
```
### 62. Unique Paths
I guess my degree was kindof worth it
https://leetcode.com/problems/unique-paths/?envType=study-plan-v2&envId=dynamic-programming
6:32
```python=
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# This is actually a fun permutation game.
return int(math.factorial(m+n-2) / (math.factorial(m-1) * math.factorial(n-1) ))
```
### 64. Minimum Path Sum
https://leetcode.com/problems/minimum-path-sum/description/?envType=study-plan-v2&envId=dynamic-programming
```python=
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
ROWS = len(grid)
COLS = len(grid[0])
minmat = [[0] * COLS for _ in range(ROWS)]
for x in range(COLS):
for y in range(ROWS):
if y==0 and x ==0:
minmat[y][x] = grid[y][x]
elif x == 0:
minmat[y][x] = minmat[y-1][x] + grid[y][x]
elif y == 0:
minmat[y][x] = minmat[y][x-1] + grid[y][x]
else:
minmat[y][x] = min(minmat[y-1][x],
minmat[y][x-1]) + grid[y][x]
return minmat[ROWS-1][COLS-1]
```