이 문제의 키 포인트는 마지막 계단을 밟는다에 있다.
마지막에 밟는 계단이 N 이라고 했을 때, N을 밟을 수 있는 조건은 2가지가 있다.
이렇게 보고 나면 쉽게 문제를 해결할 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[] stairs;
static Integer[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
stairs = new int[N + 1];
dp = new Integer[N + 1];
for(int i = 1;i <= N; i++) {
stairs[i] = Integer.parseInt(br.readLine());
}
dp[0] = 0;
dp[1] = stairs[1];
//조건을 추가하지않으면 N = 1일 때, dp[2], stairs[2]에 접근하려다 오류 발생함.
if (N >= 2) {
dp[2] = stairs[1] + stairs[2];
}
System.out.println(recur(N));
}
private static int recur(int N) {
if(dp[N] == null) {
dp[N] = Math.max(recur(N - 2), recur(N - 3) + stairs[N - 1]) + stairs[N];
}
return dp[N];
}
}
top-down 문제는 위에서 아래로 진행하며 재귀를 통해 dp를 초기화한다는 것을 기억하자.
static int[] stairs;
static Integer[] dp;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
stairs = new int[N + 1];
dp = new Integer[N + 1];
for(int i = 1;i <= N; i++) {
stairs[i] = Integer.parseInt(br.readLine());
}
dp[0] = 0;
dp[1] = stairs[1];
//조건을 추가하지않으면 N = 1일 때, dp[2], stairs[2]에 접근하려다 오류 발생함.
if (N >= 2) {
dp[2] = stairs[1] + stairs[2];
}
private static int recur(int N) {
if(dp[N] == null) {
dp[N] = Math.max(recur(N - 2), recur(N - 3) + stairs[N - 1]) + stairs[N];
}
return dp[N];
}
이 문제는 N번쨰 계단을 밟는다.가 핵심이었다. N에 도달하기 위한 조건을 서로 비교하여 가장 큰 값을 dp배열에 넣는 문제였다. 문제에서도 조건을 주었듯이 해당 조건을 가지고 N에 도달할 수 있는 조건을 만드는 것이었다.