https://leetcode.com/problems/min-cost-climbing-stairs/description/
```java
class Solution {
Map<Integer, Integer> memo = new HashMap<>(); // 중복을 방지하기 위해서 맵에 넣어두고 중복되는건 불러서 사용하기 -> 이게 dp의 포인트
int[] cost; // 전역변수로 사용하기 위해서 선언
public int minCostClimbingStairs(int[] cost) {
this.cost = cost; // cost에 초기화하기
return Math.min(result(0), result(1)); // 0번째부터 시작했을때 / 1번째부터 시작했을때 비교해서 작은걸로 return 하기
}
int result (int i) { // i == cost[]에서 몇번째인지 나타내는 변수
// 예외처리 2가지
if (i >= cost.length) return 0; // 마지막에서 끝나는게 아니기 때문에 넘어갈 수 있는데 -> 답은 + 되는 값이니까 0을 리턴해서 답에 영향이 가지 않게 처리하기
if (memo.containsKey(i)) return memo.get(i); // map으로 해놓은 곳에 혹시 그 전에 했던게 있으면 저장해놓은 것을 꺼내서 리턴하기
int min = cost[i] + Math.min(result(i+1), result(i+2)); // 현재있는 값에서 그 다음값 중에 적은 값을 찾아서 더하기.
memo.put(i, min);
return min;
}
}```