파스칼의 여행

면접 대비

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

요약
각 칸의 숫자가 오른쪽 또는 아래로 이동할 칸 수를 정하는 n×n 보드에서 왼쪽 위에서 오른쪽 아래로 가는 경로의 수를 센다.
난이도

보통10점 중 4점

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

문제

n×nn \times n 크기의 게임판이 주어진다. 각 칸에는 00부터 99까지의 한 자리 음이 아닌 정수가 하나씩 적혀 있다.

왼쪽 위 칸에서 출발하여 오른쪽 아래 칸으로 이동하는 것이 목표다. 현재 칸에 적힌 수는 다음에 이동해야 하는 정확한 걸음 수를 뜻한다. 즉, 값이 dd인 칸에서는 오른쪽으로 dd칸 또는 아래쪽으로 dd칸 중 하나로만 이동할 수 있다. 이동한 결과가 게임판을 벗어난다면 그 방향으로는 이동할 수 없으며, 모든 이동은 오른쪽 또는 아래쪽으로만 향한다. 값이 00인 칸은 한 걸음도 나아갈 수 없으므로 막다른 곳이다.

왼쪽 위 칸에서 오른쪽 아래 칸까지 가는 서로 다른 경로의 수를 구하여라.

입력

입력은 11개 이상 3030개 이하의 게임판으로 이루어지며, −1-1만 적힌 줄로 끝난다.

각 게임판은 게임판의 행(그리고 열)의 개수를 나타내는 정수 nn (4≤n≤344 \le n \le 34)이 적힌 줄로 시작한다. 그 다음 nn개의 줄에는 각각 nn개의 숫자(00부터 99까지)가 공백 없이 이어져 있다.

출력

각 게임판마다 한 줄에 왼쪽 위 칸에서 오른쪽 아래 칸까지 가는 서로 다른 경로의 수를 정수로 출력한다. 모든 게임판에서 이 값은 2632^{63}보다 작다.

힌트

모든 경로를 하나씩 확인하는 완전 탐색으로는 시간 제한을 초과하기 쉬우므로 동적 계획법을 사용하라. 모든 답은 부호 있는 64비트 정수에 들어간다(예: Java의 long, C/C++의 long long).

예제2

  1. 예제 1

    입력
    4
    2331
    1213
    1231
    3110
    4
    3332
    1213
    1232
    2120
    5
    11101
    01111
    11111
    11101
    11101
    -1
    
    예상 출력
    3
    0
    7
    
  2. 예제 2

    입력
    4
    1111
    1111
    1111
    1111
    -1
    
    예상 출력
    20