Algorithm, boj, 2579(계단오르기), dp
DP(다이나믹 프로그래밍)
- 주어진 문제를 여러 개의 부분문제들로 나누어 푼 다음, 그 결과들로 주어진 문제를 푼다
- dp는 겹치는 문제가 발생하기 때문에 메모제이션 등이 필요하다
문제 풀이
- 마지막 계단의 최대 점수를 구하는 DP문제이다
- 첫번째 계단을 밟았을때 최대 값은 첫번째 계단을 밟았을 때 받게 되는 점수이다. sum[1] = step[1];
- 두번째 계단을 밟았을때 최대 값 : 첫번째 계단을 밟고 두번째 계단 밟았을때 or 곧 바로 두번째 계단 밟았을때 이다
- 세번째 계단을 밟았을때 최대 값 : 첫번째 계단 + 세번째 or 두번째 계단 + 세번째
- n번째 계단을 밟았을때 최대 값 : n-3번째 계단에서 n-1번까지 점프 후, n번째 계단으로 or n-2번째 계단에서 n번째 계단으로
package org.baekjoon;
import java.util.Scanner;
public class test2579 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int stair[] = new int[300+1];
int n = sc.nextInt();
for (int i=1; i<=n; i++) {
stair[i] = sc.nextInt();
}
int sum[] = new int[stair.length];
for (int i = 1; i <= 3; i++) {
if (i != 3) { //세번째까지 도달하지 않았을 경우 1번째 계단 + 2번째 계단
sum[i] = sum[i-1] + stair[i];
}
else {
sum[i] = Math.max(sum[i-2] + stair[i], stair[i] + stair[i-1] );
}
}
for (int i = 4; i <= n; i++) {
sum[i] = Math.max(sum[i-3] + stair[i-1] + stair[i], sum[i-2] + stair[i]);
}
System.out.print(sum[n]);
}
}
Reference
문제바로가기
문제풀이