티스토리 뷰
어느정도 풀다가 막혀서 이 해설을 보시는 분은, 풀이 힌트를 한번 보고 다시 혼자서 풀어보세요
1. 풀이 힌트
- 꼭대기의 마지막 계단 부터 가정하여, 어떤 방식으로 플레이어가 꼭대기에 도착해야 최대 스코어를 받을 수 있을 지 고민하기.
2. 풀이 과정
- 계단이 2개 이하일 때 최댓값은 각 계단을 더한 값이 된다.
- 계단이 3개 이상일 때 부터는 꼭대기(i)에 최대값을 유지하면서 올라갈 수 있는 방법은 2가지가 된다.
1) 꼭대기(i)의 직전 계단(i - 1)을 밟은 경우
- 플레이어가 꼭대기의 직전 계단을 밟고 올라온 경우 꼭대기까지 왔을 떄 플레이어의 최대 값은
- "꼭대기(i) + 꼭대기 직전(i - 1) + 꼭대기 직전 -2 계단(i - 3)까지의 최댓값"이 된다.
- 한번에 연속된 3개의 계단을 동시에 올라갈 수 없기 때문에 마지막에 꼭대기 직전 -2 계단까지의 최댓값을 더해준다.
2) 꼭대기(i)의 전전 계단(i - 2)에서 점프해서 올라온 경우
- "꼭대기(i) + 꼭대기 전전 계단(i - 2)까지의 최댓값"
- 한 계단 또는 두 계단을 건널 수 있기 때문에 꼭대기 전전 계단까지의 최댓값도 2가지의 경우로 나뉘어서 판별하기 떄문에 꼭대기 전전계단까지의 최댓값을 구하고 꼭대기의 값과 더해준다
3. 핵심 포인트
- 다른 DP문제와 동일하게, 경우에 수에 따라 점화식을 도출할 수 있고, 주어진 조건을 구하기 위해 누적합을 저장하는 배열을 선언해야한다.
4. 코드 구현
import java.util.Scanner;
public class Upstairs {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int jump = 0, noJump = 0;
int n = sc.nextInt();
int[] stairs = new int[301];
int[] dp = new int[301];
for (int i = 1; i <= n; i++) {
stairs[i] = sc.nextInt();
}
dp[1] = stairs[1];
dp[2] = stairs[1] + stairs[2];
for (int i = 3; i <= n; i++) {
noJump = stairs[i] + stairs[i - 1] + dp[i - 3];
jump = stairs[i] + dp[i - 2];
dp[i] = Math.max(noJump, jump);
}
System.out.println(dp[n]);
}
}
문제 링크 ( https://www.acmicpc.net/problem/2579 )
'Algorithm > 백준' 카테고리의 다른 글
Backjoon(백준) 10844번 - 쉬운 계단 수(Java) (0) | 2020.04.28 |
---|---|
Backjoon(백준) 1463번 - 1로 만들기(Java) (0) | 2020.04.28 |
Backjoon(백준) 1932번 - 정수삼각형(Java) (0) | 2020.04.25 |
Backjoon(백준) 1149번 - RGB거리(Java) (0) | 2020.04.25 |
Backjoon(백준) 9641번 - 파도반 수열(Java) (0) | 2020.04.24 |
- 20200319
- 20200503
- 20200317
- 20200502
- 20200804
- 20200425
- 생활코딩리눅스
- 20200417
- 20200330
- 20200421
- 20200622
- 20200427
- 20200428
- 20201204
- 20200512
- 20200423
- 20200415
- 20200429
- 20200624
- 20200504
- chapter8
- 백준
- likelion
- 20200420
- chapter7
- 20200403
- 20200413
- 20200424
- 20200510
- 20200406
- Total
- Today
- Yesterday