結果

問題 No.134 走れ!サブロー君
ユーザー Ueki
提出日時 2019-05-16 12:51:45
言語 Python3
(3.7.1 + numpy 1.14.5 + scipy 1.1.0)
結果
AC  
実行時間 731 ms
コード長 1,751 Byte
コンパイル時間 46 ms
使用メモリ 8,200 KB
最終ジャッジ日時 2019-08-12 17:49:01

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
01.txt AC 20 ms
6,872 KB
02.txt AC 21 ms
6,868 KB
03.txt AC 19 ms
6,868 KB
04.txt AC 29 ms
6,872 KB
05.txt AC 43 ms
6,868 KB
06.txt AC 74 ms
6,872 KB
07.txt AC 150 ms
6,872 KB
08.txt AC 322 ms
6,872 KB
09.txt AC 722 ms
8,200 KB
10.txt AC 731 ms
8,200 KB
system_test1.txt AC 19 ms
6,872 KB
system_test2.txt AC 18 ms
6,868 KB
system_test3.txt AC 18 ms
6,868 KB
system_test4.txt AC 19 ms
6,872 KB
system_test5.txt AC 19 ms
6,872 KB
テストケース一括ダウンロード

ソースコード

diff #
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline


def manhattan(item1, item2):
    return abs(item1[0]-item2[0])+abs(item1[1]-item2[1])


def calcCost(dropItem, last_visit, loading_weight):
    dist = manhattan(dropItem, last_visit)
    return (loading_weight+100)/120*dist+dropItem[2]


def calcLoadingWeight(current_state):
    """
    現在積んでいる重み
    """
    load = 0
    for i in range(N):
        if current_state >> i & 1 == 0:  # 積んでいる(0)なら加える
            load += items[i][2]
    return load


SX, SY = map(int, input().split())
N = int(input())
items = [list(map(float, input().split())) for _ in range(N)]

# dp[状態bit][最後に訪れた場所]
dp = [[float('inf')]*N for _ in range(1 << N)]

dp[0][0] = 0

for mask in range(1 << N):
    for new_item in range(N):  # 次に行く場所
        if mask >> new_item & 1:
            continue

        new_state = mask | 1 << new_item  # 訪問後のbit
        loading_weight = calcLoadingWeight(mask)
        if mask == 0:  # 一番初めの訪問
            cost = calcCost(items[new_item], [SX, SY], loading_weight)
            dp[new_state][new_item] = cost
        else:
            for last_visit in range(N):
                if mask >> last_visit & 1:
                    cost = calcCost(items[new_item],
                                    items[last_visit], loading_weight)
                    dp[new_state][new_item] = min(
                        dp[new_state][new_item], dp[mask][last_visit]+cost)

ans = float('inf')
for last_visit in range(N):
    # 最後に、始点に戻ってくるコストを加える
    ans = min(ans, dp[-1][last_visit] +
              calcCost([SX, SY, 0], items[last_visit], 0))
print(ans)
0