문제


https://www.acmicpc.net/problem/4243


풀이


가로등 끄기 문제와 유사하다.

똑같이 (lower bound, upper bound), 현재 위치를 이용해 N * N * 2 DP 테이블을 이용하면 되며, 이동할 때마다 방문하지 않은 상점의 수 x 이동거리를 더해주면 된다.


코드


import sys


def f(i, j, flag):
    if dp[i][j][flag] != -1:
        return dp[i][j][flag]
    
    if flag:
        cur = j
    else:
        cur = i
    
    on = n - j + i - 1
    res = float('inf')

    if i > 0:
        res = min(res, f(i - 1, j, 0) + on * (acc[cur] - acc[i - 1]))
    
    if j < n - 1:
        res = min(res, f(i, j + 1, 1) + on * (acc[j + 1] - acc[cur]))
    
    dp[i][j][flag] = res
    return res


for _ in range(int(sys.stdin.readline())):
    n = int(sys.stdin.readline())
    a = int(sys.stdin.readline()) - 1
    t = [int(sys.stdin.readline()) for i in range(n - 1)]
    acc = [0]
    for i in range(n - 1):
        acc.append(acc[-1] + t[i])
    dp = [[[-1, -1] for j in range(n)] for i in range(n)]
    dp[0][-1][0] = dp[0][-1][1] = 0

    print(f(a, a, 0))

Leave a comment