https://www.acmicpc.net/problem/2579
문제



풀이
계단을 오를 때 합을 계속 기억하고 있어야 하기 때문에 다이내믹 프로그래밍으로 풀어야 한다
Top-Down 재귀 형식으로 해결하려 하는데 핵심은 N-1 일 때는 재귀 호출을 하지 않는다는 점이다
왜냐하면 연속된 세 개의 계단은 밟을 수 없기 때문에 N-2의 dp값과 N-3 dp값에 arr[N-1]을 더한 값 중 큰 것을 선택하고 자기 자신의 값을 더한 것을 dp[N]으로 한다
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static Integer[] dp;
static int[] arr;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
dp = new Integer[N + 1];
arr = new int[N + 1];
for (int i = 1; i <= N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
dp[0] = arr[0];
dp[1] = arr[1];
// N이 1이 나올 수 있으니 N이 2 이상일 때만 dp[2] 초기 설정
if (N >= 2) {
dp[2] = arr[1] + arr[2];
}
System.out.println(stair(N));
}
static int stair(int N) {
if (dp[N] == null) {
dp[N] = Math.max(stair(N - 2), stair(N - 3) + arr[N - 1]) + arr[N];
}
return dp[N];
}
}
결과
