https://www.acmicpc.net/problem/2579
각 계단마다 점수가 있고 최대의 점수를 획득하면서 꼭대기 까지 가는 게임이다. 도착 계단은 반드시 밟아야 한다.
한번에 한칸 또는 두칸을 갈 수 있고 연속으로 3칸은 갈 수 없다.
계단 점수 배열을 입력하고 최대 점수를 출력해야 하는 문제이다.
DP를 이용해 해결할 수 있다.
dp[n]가 n칸까지의 최대 점수라고 하자. (n칸이 도착 계단) (계단 점수 배열 a[n])
n을 밟았을 때 이전 경우를 두가지로 나눌 수 있는데
1의 경우 n-2를 밟았다면 3칸 연속이기 때문에 n-2는 밟을 수 없다.
2의 경우는 n-2를 무조건 밟는다. 세칸을 뛸 수는 없기 때문.
이를 점화식으로 나타내면 다음과같다.
1. dp[n] = ( dp[n-3] + a[n-1] ) + a[n] // dp[n-1]이 아닌 a[n-1] 이유는 dp[n-1]는 n-2를 밟았는지 여부를 알 수 없기 때문 2. dp[n] = dp[n-2] + a[n]
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 계단 수
int[] dp = new int[n+1]; // 누적 값 저장 배열
int[] arr = new int[n+1]; // 계단 점수 배열
// 이해 쉽게 인덱스 1부터 시작
for (int i=1; i<=n; i++)
arr[i] = sc.nextInt();
dp[0] = 0; // 시작
dp[1] = arr[1]; // 계단 하나일 때
if (n >= 2) // n=1인 경우 대비
dp[2] = arr[1] + arr[2];
for(int i=3; i<=n; i++)
{
dp[i] = Math.max(dp[i-2], dp[i-3] + arr[i-1]) + arr[i];
}
System.out.println(dp[n]);
}
}