백준 2618 - 경찰차 (파이썬)

Updated:

Answer

import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline

N = int(input())
W = int(input())
MAX = W + 6

task = [[1, 1], [N, N]]
dp = [[-1] * MAX for _ in range(MAX)]
answer = [[0] * (MAX) for _ in range(MAX)]

def get_distance(a, b):
    return abs(a[0] - b[0]) + abs(a[1] - b[1])

def solve(a, b):
    current = max(a, b) + 1
    
    if current == W + 2:
        return 0

    tmp = dp[a][b]
    if tmp != -1:
        return tmp

    x = solve(a, current) + get_distance(task[b], task[current])
    y = solve(current, b) + get_distance(task[a], task[current])

    if x > y:
        answer[a][b] = 1
    else:
        answer[a][b] = 2

    dp[a][b] = min(x, y)
    
    return dp[a][b]


for _ in range(W):
    a, b = map(int, input().split())

    task.append([a, b])

print(solve(0, 1))

i, j = 0, 1

while max(i, j) + 1 < W + 2:
    print(answer[i][j])
    if answer[i][j] == 1:
        i = max(i, j) + 1
    else:
        j = max(i, j) + 1
        

Categories:

Updated: