타일링 문제는 다이나믹 프로그래밍의 기본이라고 한다.
다이나믹 프로그래밍으로 풀기 위해서는, 이 문제에 규칙을 먼저 파악해야 한다.
가로 길이가 1일 때부터 하나씩 그려보면, 다음과 같다.
그림에서 알 수 있듯이, 마지막에 오는 타일(초록색)은 2가지 경우밖에 없다.
즉, 가로가 N일 때, 점화식을 표현해보자면 다음과 같다.
D[N] = D[N-1] + D[N-2]
public int tiling(int num) {
if(num <= 2){
return num;
}
return tiling(num-1) + tiling(num -2);
}
public int tiling(int num) {
// num이 1, 2인 경우를 초기화
ArrayList<Integer> al = new ArrayList<>(Arrays.asList(0,1,2));
return aux(al, num);
}
public int aux(ArrayList<Integer> al, int num){
if(al.size() > num) return al.get(num); // memo에 존재한다면, 그 값을 가져온다.
al.add(aux(al, num-1) + aux(al, num-2));
return al.get(num);
}
[참고]
https://blog.naver.com/PostView.naver?blogId=ndb796&logNo=221233586932