비트 문자열 재배열하기

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

요약
주어진 비트열을 런 코드가 나타내는 목표 문자열로 만드는 최소 인접 교환 횟수를 구합니다.
난이도

보통10점 중 4점

유형
그리디, 완전 탐색
정답자
아직 제출이 없습니다

문제

비트 문자열은 0과 1로만 이루어진 문자열이다. 비트 문자열 하나를 받아서 정해진 문자열로 바꾸어야 한다. 이때 할 수 있는 연산은 인접한 두 비트를 서로 바꾸는 것 하나뿐이다.

처음 문자열은 비트를 그대로 나열해서 주어진다. 반면 목표 문자열은 '연속 코드'로 주어진다. 연속 코드는 문자열에 나타나는 연속된 0 또는 1의 개수를 앞에서부터 차례대로 적은 수열이다. 예를 들어 "011100"의 연속 코드는 "1 3 2"이다. 연속 코드가 같은 문자열은 항상 두 개다. 0으로 시작하는 것 하나와 1로 시작하는 것 하나다.

처음 문자열을 목표 문자열로 바꾸는 데 필요한 최소 연산 횟수를 구하여라.

입력

첫 줄에 두 정수 NN (1≤N≤151 \le N \le 15)과 MM (1≤M≤N1 \le M \le N)이 주어진다. 둘째 줄에 처음 문자열을 이루는 NN개의 비트가 공백으로 구분되어 주어진다. 셋째 줄에 목표 문자열의 연속 코드가 MM개의 정수로 차례대로 주어진다.

연속 코드의 각 수는 1 이상이고, 모두 더하면 NN이 된다. 주어진 비트 문자열을 연속 코드가 나타내는 문자열로 항상 바꿀 수 있음이 보장된다.

출력

필요한 최소 연산 횟수를 출력한다.

힌트

비트 문자열 "100101"을 연속 코드가 "1 3 2"인 문자열로 바꾸는 경우를 보자. 목표가 될 수 있는 문자열은 "011100"과 "100011" 두 개다. "011100"으로 바꾸려면 연산이 4번 필요하지만, "100011"로 바꾸려면 1번이면 충분하다. 따라서 답은 1이다.

예제4

  1. 예제 1

    입력
    6 3
    1 0 0 1 0 1
    1 3 2
    
    예상 출력
    1
    
  2. 예제 2

    입력
    7 2
    1 1 1 0 0 0 0
    4 3
    
    예상 출력
    12
    
  3. 예제 3

    입력
    15 14
    1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 2
    
    예상 출력
    7
    
  4. 예제 4

    입력
    1 1
    0
    1
    
    예상 출력
    0