유리구슬 (Glass Bead)

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

요약
맨 아래 y=0 줄의 구슬 배치가 주어질 때, 각 구슬이 아래 두 칸을 필요로 한다는 조건 아래 위로 쌓아 총 구슬 개수의 최댓값을 구한다.
난이도

보통10점 중 7점

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

문제

투명한 유리구슬처럼 보이지만

그렇게 쉽게 깨지진 않을 거야

사랑해 너만을 변하지 않도록

영원히 널 비춰줄게

유리구슬로 깨지지 않을 구조물을 만들고자 한다.

구조물은 다음과 같은 피라미드 격자의 (x,y)(x,y)에 유리구슬을 놓아 만들어진다. (x,yx, y는 00 이상의 정수)

y>0y>0인 좌표의 구조물이 깨지지 않도록 하기 위해서, 구조물은 다음 조건을 충족해야 한다.

  • (x,y)(x,y)에 유리구슬이 있으려면 (x,y−1)(x,y-1), (x+1,y−1)(x+1,y-1)에 모두 유리구슬이 있어야 한다.

구조물의 y=0y=0 부분의 정보가 주어졌을 때, y>0y>0인 곳에 유리구슬을 적절히 놓아 만들 수 있는 구조물의 유리구슬 개수의 최댓값을 구하여라.

입력

첫째 줄에 정보가 주어질 범위 NN이 주어진다.

둘째 줄에 구조물의 y=0y=0인 곳의 정보가 길이 NN의 문자열 형식으로 주어진다.

문자열의 ii번째 문자가 1이라면 (i−1,0)(i-1,0)에 유리구슬이 있고, 아니라면 유리구슬이 없다. (1≤i≤N1\leq i\leq N)

범위를 벗어나는 (x,0)(x,0) (x≥N)(x\geq N)에는 유리구슬이 없다.

출력

첫째 줄에 구조물의 유리구슬 개수의 최댓값을 출력한다.

제한

  • 1≤N≤2000001\leq N\leq 200000

힌트

답이 C++의 int 범위를 넘어갈 수 있으므로 long long 자료형을 사용하는 것을 추천한다.

예제1

  1. 예제 1

    입력
    8
    11011101
    
    예상 출력
    10