Module: 동적 프로그래밍의 패턴 - 2


Problem

1 /5


채우기 게임

Theory Click to read/hide

고지 사항: 아래에 설명된 방법은 보편적이지 않지만 종종 문제를 해결하거나 올바른 솔루션을 찾는 데 도움이 될 수 있습니다.

문제가 배열을 최적으로 파괴/축소/병합(또는 유사)하도록 요청하는 경우 하위 세그먼트에서 동적 프로그래밍을 사용하여 문제를 해결해야 합니다.

dp[l][r] - 인덱스가 l에서 r까지인 하위 세그먼트에 대한 최적의 답을 구해 봅시다. 역학의 재계산은 작업에 따라 다르지만 다음과 같은 일반적인 아이디어가 있습니다.

1) 극단 요소 l과 r을 보십시오. 다른 방법으로 일치하거나 보완하는 경우 dp[l+1][r-1]을 통해 dp[l][r]의 값을 업데이트하는 것이 가능할 가능성이 높습니다. 그렇지 않으면 dp[l][r-1] 또는 dp[l+1[r]을 통해.

2) 세그먼트 [l;r]을 단일 구성으로 표현할 수 없는 경우가 종종 발생합니다. 그런 다음 이 하위 세그먼트의 모든 가능한 섹션을 두 부분으로 고려해야 합니다. 즉, 요소 ​​k를 l에서 r-1까지 반복하고 dp[l][r]에서 dp[l][k] 및 dp[를 통해 다시 계산해야 합니다. k+1][r] . 더 작은 하위 세그먼트에서는 이러한 섹션도 분류되었으므로 실제로 하위 세그먼트 [l;r]를 두 부분뿐만 아니라 여러 부분으로 분할하는 옵션이 고려됩니다.
 

Problem

왼쪽에서 오른쪽으로 1부터 n까지 번호가 매겨진 n개의 색 사각형으로 구성된 체크무늬 종이 조각이 주어집니다. i번째 사각형은 처음에 ci로 색상이 지정됩니다.

c= cj 및 c= ck인 경우 사각형 i와 j는 동일한 구성 요소에 있다고 말합니다. i <를 만족하는 모든 k에 대해 k < 제이. 즉, i에서 j까지의 세그먼트에 있는 모든 사각형은 동일한 색상이어야 합니다.
예를 들어 스트립 [3,3,3]에는 연결된 구성 요소가 1개 있고 [5,2,4,4]에는 3개가 있습니다.

게임 채우기 다음과 같이 이 스트립에서 재생됩니다.
게임을 시작할 때 임의의 시작 사각형 하나를 선택합니다(턴으로 계산하지 않음).
그런 다음 이동할 때마다 시작 사각형을 포함하는 연결된 구성 요소의 색상을 다른 색상으로 변경합니다.

전체 스트립을 한 가지 색상으로 다시 칠하는 데 필요한 최소 이동 수를 찾으십시오.

입력:
첫 번째 줄에는 단일 정수 n(1 ≤ n ≤ 5000)이 포함됩니다. 제곱의 수입니다.

두 번째 줄에는 정수 c1,c2,…,cn (1 ≤ ci > <5000) — 사각형의 초기 색상.

출력:
단일 정수 인쇄 — 최소한의 이동 횟수.

예:
  <몸>
설명:
첫 번째 예에서 최적의 방법 중 하나: [5, 2, 2, 1] -> [5, 2, 2, 2] -> [5, 5, 5, 5]
입력 출력
4
5 2 2 1
2
8
4 5 2 2 1 3 5 5
4
1
4
0