아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

팁오버 변환

시간 제한1초메모리 제한1024 MB

요약
칸마다 높이가 다른 블록이 세워져 있을 때, 일부 블록을 미리 눕혀서 주인공이 0번 칸에서 N번 칸까지 갈 수 있는 큐브 블록의 최소 개수를 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 그리디, 배열
정답자
아직 제출이 없습니다

문제

팁오버는 6×66 \times 6 크기의 보드판에 높이가 다른 블록을 배치한 뒤 블록을 쓰러뜨려, 주인공이 출발지에서 목적지까지 이동할 수 있게 만드는 퍼즐 게임이다. 어느 날 이 퍼즐을 풀던 시헌이는 지루해져서 다음과 같은 11차원 팁오버 게임을 생각해냈다.

  • 보드판은 (N+1)(N + 1)개의 칸이 일렬로 늘어선 구조다. 각 칸은 가로와 세로가 1 cm1\text{ cm}인 정사각형이며, 왼쪽부터 차례로 00부터 NN까지 번호가 붙는다.
  • 각 칸에는 블록이 최대 한 개 놓일 수 있다. 모든 블록은 처음에 세워져 있다. 세워진 블록은 가로와 세로가 각각 1 cm1\text{ cm}이고 높이가 2 cm2\text{ cm} 이상인 직육면체다. 각 블록의 높이는 1 cm1\text{ cm}의 정수 배다.
  • 세워진 블록은 왼쪽이나 오른쪽으로 쓰러뜨릴 수 있다. ii번 칸에 높이가 k cmk\text{ cm}인 블록이 있을 때, 왼쪽으로 쓰러뜨리면 (i−k)(i-k)번 칸부터 (i−1)(i-1)번 칸까지를 덮고, 오른쪽으로 쓰러뜨리면 (i+1)(i+1)번 칸부터 (i+k)(i+k)번 칸까지를 덮는다. 블록이 덮는 칸에 다른 블록이 없고 덮는 칸이 모두 보드판 안에 있을 때에만 그 블록을 쓰러뜨릴 수 있다. 쓰러뜨린 블록은 더 이상 움직일 수 없다.
  • 00번 칸에는 높이가 1 cm1\text{ cm}인 블록이 있다. 주인공은 처음에 00번 칸 위에 있으며, NN번 칸에 도착하면 게임을 클리어할 수 있다. 주인공은 인접한 칸으로만 이동할 수 있고, 블록 높이와 관계없이 블록이 놓인 칸으로만 이동할 수 있다.

하지만 시헌이는 게임을 클리어할 수 없는 배치가 있다는 것을 깨달았다. 그래서 다음 규칙을 추가했다.

  • 주인공은 게임을 시작하기 전에 블록을 몇 개 미리 쓰러뜨릴 수 있다. 블록을 쓰러뜨리는 순서에는 제약이 없다.
  • 주인공이 있는 칸과 인접한 칸에 블록이 없으면, 주인공은 그 인접한 칸에 높이가 1 cm1\text{ cm}인 큐브 블록을 추가할 수 있다. 큐브 블록은 쓰러뜨릴 수 없다.

시헌이는 자신이 만든 보드판에서 게임을 진행할 때 큐브 블록이 최소 몇 개 있어야 클리어할 수 있는지 궁금해졌다. 이 문제를 해결하라.

입력

첫째 줄에 NN이 주어진다. (3≤N≤300 0003 \le N \le 300\,000) 둘째 줄에 NN개의 정수 A1,A2,…,ANA_1, A_2, \ldots, A_N이 공백으로 구분되어 주어진다. AiA_i는 22 이상 NN 이하의 정수이거나 00이다. Ai=0A_i = 0이면 처음에 ii번 칸에 블록이 없고, Ai>0A_i > 0이면 처음에 ii번 칸에 높이가 AiA_i인 블록이 있다.

출력

미리 몇 개의 블록을 쓰러뜨릴 때, 시헌이가 게임을 클리어하기 위해 추가해야 하는 큐브 블록의 최소 개수를 출력한다.

예제1

  1. 예제 1

    입력
    12
    0 0 2 0 3 0 0 0 0 2 0 2
    
    예상 출력
    5