https://school.programmers.co.kr/learn/courses/30/lessons/12971
Level 3
N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다.

원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록 하고 싶습니다. 단 스티커 한 장을 뜯어내면 양쪽으로 인접해있는 스티커는 찢어져서 사용할 수 없게 됩니다.
예를 들어 위 그림에서 14가 적힌 스티커를 뜯으면 인접해있는 10, 6이 적힌 스티커는 사용할 수 없습니다. 스티커에 적힌 숫자가 배열 형태로 주어질 때, 스티커를 뜯어내어 얻을 수 있는 숫자의 합의 최댓값을 return 하는 solution 함수를 완성해 주세요. 원형의 스티커 모양을 위해 배열의 첫 번째 원소와 마지막 원소가 서로 연결되어 있다고 간주합니다.
제한 사항
class Solution {
public int solution(int sticker[]) {
int N = sticker.length;
if(N == 1) return sticker[0];
int[] dp1 = new int[N];
int[] dp2 = new int[N];
dp1[0] = sticker[0];
dp1[1] = sticker[0];
for(int i = 2; i < N - 1; i++){
dp1[i] = Math.max(dp1[i-1], dp1[i-2] + sticker[i]);
}
dp2[1] = sticker[1];
for(int i = 2; i < N; i++){
dp2[i] = Math.max(dp2[i-1], dp2[i-2] + sticker[i]);
}
return Math.max(dp1[N-2], dp2[N-1]);
}
}

스티커가 원형으로 배치되어 있기 때문에, 첫 번째 스티커를 선택하는 경우와 선택하지 않는 경우로 나누어 DP를 각각 계산해야한다.
0부터 시작인 경우
1. 0번 스티커를 선택하는 경우, 1번도 선택할 수 없으므로 0번과 1번 dp 값을 sticker[0]으로 초기화한다.
2. 2번 인덱스부터, N-2번째 인덱스까지만 사용하기 때문에 반복문으로 점화식을 처리한다.
1부터 시작인 경우
1. 1번 인덱스에 스티커 1번의 값으로 초기화를 해준다.
2. 2번 인덱스부터, N-1번째 인덱스까지만 사용하기 때문에 반복문으로 점화식을 처리한다.
점화식은 이전까지의 최대값(dp[i-1])과, 두 칸 전의 최대값(dp[i-2])에 현재 스티커를 더한 값 중 더 큰 값을 선택하는 방식으로 세우면 된다.