목차

계산 로봇

ps
링크acmicpc.net/…
출처BOJ
문제 번호22342
문제명계산 로봇
레벨실버 1
분류

DP

시간복잡도O(nm)
인풋사이즈n<=2000, m<=2000
사용한 언어Python
제출기록61484KB / 1920ms
최고기록1920ms
해결날짜2022/02/18

풀이

코드

코드 1 - 기본 코드. PyPy로만 통과 가능

"""Solution code for "BOJ 22342. 계산 로봇".

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

import sys


def main():
    # pylint: disable=unused-variable
    M, N = [int(x) for x in sys.stdin.readline().split()]
    D = [[int(x) for x in sys.stdin.readline().rstrip()] for _ in range(M)]

    dp_cur = [0] * M
    for j in range(N - 1):
        dp_prev, dp_cur = dp_cur, [0] * M
        for i in range(M):
            dp_cur[i] = max(
                dp_prev[x] + D[x][j] for x in (i - 1, i, i + 1) if 0 <= x < M)
    print(max(dp_cur))


if __name__ == '__main__':
    main()

코드 2 - 최적화 버전

"""Solution code for "BOJ 22342. 계산 로봇".

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

import sys


def main():
    # pylint: disable=unused-variable
    M, N = [int(x) for x in sys.stdin.readline().split()]
    D = [[int(x) for x in sys.stdin.readline().rstrip()] for _ in range(M)]

    if M == 1:
        print(sum(D[0][:-1]))
        return

    dp_cur = [0] * M
    for d_col in zip(*D):
        dp_prev, dp_cur = dp_cur, []
        dp_cur.append(max(dp_prev[0], dp_prev[1]) + d_col[0])
        dp_cur.extend(
            max(x, y, z) + d
            for x, y, z, d in zip(dp_prev, dp_prev[1:], dp_prev[2:], d_col[1:]))
        dp_cur.append(max(dp_prev[-1], dp_prev[-2]) + d_col[-1])

    print(max(dp_cur[i] - D[i][-1] for i in range(M)))


if __name__ == '__main__':
    main()