- boj.kr/11602
- https://studykty.tistory.com/192 의 내용을 참고하여 품.
- https://github.com/ChoiWheatley/choi-workspace/blob/master/ALGORITHMS/bak/problem/11062/solution.hpp
TL;DR#
DP[i][j]
: i~j번째 카드가 있을 때 근우가 얻을 수 있는 최대 점수를 저장한다.
상대 플레이어도 같은 DP배열을 사용한다.#
문제 특성상, 플레이어가 모든 카드를 반반 갈라먹기 때문에 (카드 개수가 홀수라면 근우가 하나 더 챙김) DP[i][j]
에 대하여 cards[i:j].sum() - DP[i][j]
하면 턴 상관 없이 상대플레이어의 점수를 알 수 있다. 이 점을 착안하여 점화식을 세울 수 있다. 진짜 DP인지도 몰랐는데...
- 초기 조건
DP[i, i] = c[i]
DP[i, i+1] = max(c[i], c[i+1])
- 점화식
DP[k, j] = max(c[k] + c[k+1 : j].sum() - DP[k+1, j],
c[j] + c[k : j-1].sum() - DP[k, j-1])
- 점화식 의미
카드의 리스트 중에서 맨 왼쪽c[k]
또는 맨 오른쪽c[j]
카드를 뽑고 상대 플레이어가 다음 범위에서 얻을 수 있는 최선의 점수를 해당 범위의 카드의 총합에서 뺀 결과를 서로 더한다면 이번 범위에서 얻을 수 있는 최선의 점수가 된다.이거는 도대체 누구 머리에서 나온거냐