사용자 도구

사이트 도구


ps:problems:boj:17069

파이프 옮기기 2

ps
링크acmicpc.net/…
출처BOJ
문제 번호17069
문제명파이프 옮기기 2
레벨골드 5
분류

DP

시간복잡도O(n^2)
인풋사이즈n<=32
사용한 언어Python
제출기록29200KB / 80ms
최고기록56ms
해결날짜2021/10/17

풀이

코드

"""Solution code for "BOJ 17069. 파이프 옮기기 2".

- Problem link: https://www.acmicpc.net/problem/17069
- Solution link: http://www.teferi.net/ps/problems/boj/17069

Tags: [DP]
"""

WALL = '1'


def main():
    N = int(input())
    grid = [input().split() for _ in range(N)]
    dp_hor_cur, dp_ver_cur, dp_diag_cur = [0] * N, [0] * N, [0] * N
    dp_hor_cur[1] = 1
    for c in range(2, N):
        dp_hor_cur[c] = 0 if grid[0][c] == WALL else dp_hor_cur[c - 1]
    for r in range(1, N):
        dp_hor_prev, dp_hor_cur = dp_hor_cur, [0] * N
        dp_ver_prev, dp_ver_cur = dp_ver_cur, [0] * N
        dp_diag_prev, dp_diag_cur = dp_diag_cur, [0] * N
        for c in range(1, N):
            if grid[r][c] == WALL:
                continue
            dp_hor_cur[c] = dp_hor_cur[c - 1] + dp_diag_cur[c - 1]
            dp_ver_cur[c] = dp_ver_prev[c] + dp_diag_prev[c]
            if WALL not in (grid[r - 1][c], grid[r][c - 1]):
                dp_diag_cur[c] = (dp_hor_prev[c - 1] + dp_ver_prev[c - 1] +
                                  dp_diag_prev[c - 1])

    print(dp_hor_cur[-1] + dp_ver_cur[-1] + dp_diag_cur[-1])


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
Q K Q E​ V
 
ps/problems/boj/17069.txt · 마지막으로 수정됨: 2021/10/17 13:11 저자 teferi