제단

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

요약
같은 높이의 연속 구간 양 끝을 제외한 안쪽을 1씩 올리는 연산을 반복해 만들 수 있는 기둥 높이 수열 중, 도난당하지 않은(-1이 아닌) 값과 일치하는 수열의 개수를 센다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 행렬, 구현
정답자
아직 제출이 없습니다

문제

상근이는 성적이 오르기를 기원하며 NN개의 열로 이루어진 제단을 쌓기로 했다.

제단의 각 열의 높이는 정수이고, 처음에는 모든 열의 높이가 00이다. 제단은 다음 과정을 반복하여 만든다.

  1. 높이가 모두 같은, 연속한 열들의 구간을 하나 고른다.
  2. 고른 구간에서 양 끝의 두 열을 제외한 나머지 모든 열의 높이를 11씩 올린다.

아래 그림은 제단을 쌓는 과정의 한 예이다.

오랜 세월이 흐르는 동안 여러 도둑이 제단의 일부 열을 훔쳐 갔다. 상근이의 먼 후손은 지금 남아 있는 열들의 높이만 알고 있으며, 이 높이와 일치하도록 쌓을 수 있는 제단이 몇 가지인지 세려고 한다.

남아 있는 높이가 주어졌을 때, 이 높이와 일치하는 제단의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 제단의 열의 개수 NN이 주어진다. (1≤N≤1041 \le N \le 10^4)

둘째 줄에 공백으로 구분된 NN개의 정수 h1,h2,…,hNh_1, h_2, \dots, h_N이 주어진다. (−1≤hi≤104-1 \le h_i \le 10^4) hih_i는 ii번째 열의 높이이며, −1-1이면 그 열은 도둑이 훔쳐 가 높이를 알 수 없음을 뜻한다.

출력

남아 있는 높이와 일치하는 제단의 개수를 109+710^9 + 7로 나눈 나머지를 첫째 줄에 출력한다.

예제3

  1. 예제 1

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

    입력
    3
    -1 -1 -1
    
    예상 출력
    2
    
  3. 예제 3

    입력
    6
    -1 -1 -1 2 -1 -1
    
    예상 출력
    3