높이가 감소하지 않는 순서로 모든 블록을 제거하되, 줄어드는 열을 좌우로 오가는 기계의 이동 횟수가 최소가 되도록 한다.
보통7동적 계획법그리디구간구현면접 대비아직 제출이 없습니다시간 제한2초메모리 제한512 MB블록 N개가 일렬로 놓여 있다. 가장 왼쪽 블록이 1번이고 그 오른쪽 블록이 2번이며, 같은 방식으로 가장 오른쪽 블록이 N번이다. i번 블록의 높이는 Hi이다.
블록 앞에는 작은 기계가 한 대 놓여 있다. 처음에 기계는 1번 블록 앞에 있다. 목표는 이 기계로 블록을 모두 제거하는 것이다. 제거한 순서대로 높이를 적은 수열은 비내림차순이어야 한다.
기계에 내릴 수 있는 명령은 세 가지이다.
블록을 제거하면 남은 블록의 번호가 다시 매겨진다. 예를 들어 높이가 왼쪽부터 (2,3,4,5,6)이고 기계가 높이 4인 블록 앞에 있다고 하자. 높이가 4인 블록은 왼쪽에서 세 번째이므로 3번이다. 이 블록을 제거하고 왼쪽으로 이동하면 높이는 (2,3,5,6)이 되고 기계는 높이 3인 블록, 즉 2번 블록 앞에 있게 된다. 오른쪽으로 이동하면 높이는 똑같이 (2,3,5,6)이 되고 기계는 높이 5인 블록, 즉 3번 블록 앞에 있게 된다.
목표를 달성하는 데 필요한 명령의 최소 횟수를 구하는 프로그램을 작성하시오.
길이가 K인 수열 A1,A2,…,AK가 A1≤A2≤⋯≤AK를 만족하면 비내림차순이라고 한다.
첫째 줄에 블록의 개수 N이 주어진다. (1≤N≤100000)
둘째 줄에 블록의 높이 H1,H2,…,HN이 순서대로 주어진다. (1≤Hi≤100000)
첫째 줄에 목표를 달성하는 데 필요한 명령의 최소 횟수를 출력한다.
첫 번째 예제는 다음과 같이 명령하면 된다. 기계 앞에 있는 블록을 대괄호로 표시한다.
두 번째 예제는 다음과 같이 명령해야 한다.