結果
| 問題 |
No.2366 登校
|
| コンテスト | |
| ユーザー |
👑 SPD_9X2
|
| 提出日時 | 2023-06-30 22:28:18 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 3,158 ms / 4,000 ms |
| コード長 | 1,331 bytes |
| コンパイル時間 | 310 ms |
| コンパイル使用メモリ | 81,920 KB |
| 実行使用メモリ | 163,004 KB |
| 最終ジャッジ日時 | 2025-06-20 11:11:35 |
| 合計ジャッジ時間 | 18,377 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 26 |
ソースコード
"""
N,M が小さいんだよな
つまり、Tが大きい場合は無視で構わない
後は…
dp[x][y][T] = x,y に時刻Tで居る為に必要な最小コスト
で良いか
時刻は, T-(N-1-M-1)
-200 ~ T 位まで考慮しておけばいいかな
"""
import sys
from sys import stdin
import heapq
N,M,K,T = map(int,stdin.readline().split())
AB_to_CD = [[None] * M for i in range(N)]
for i in range(K):
A,B,C,D = map(int,stdin.readline().split())
A -= 1
B -= 1
AB_to_CD[A][B] = (C,D)
dp = [[[float("inf")] * 500 for i in range(M)] for j in range(N)]
dp[0][0][0] = 0
q = [ (0,0,0,0) ]
while q:
cost,x,y,t = heapq.heappop(q)
if (x,y) == (N-1,M-1) and t <= T:
print (cost)
sys.exit()
if dp[x][y][t] != cost:
continue
if t <= N+M+10:
for nx,ny in ( (x+1,y),(x-1,y),(x,y-1),(x,y+1) ):
if 0 <= nx < N and 0 <= ny < M and dp[nx][ny][t+1] > dp[x][y][t]:
dp[nx][ny][t+1] = dp[x][y][t]
heapq.heappush( q,(dp[nx][ny][t+1] , nx , ny , t+1) )
if AB_to_CD[x][y] != None:
C,D = AB_to_CD[x][y]
nexT = max(-200 , t-C+1)
if dp[x][y][nexT] > D + dp[x][y][t]:
dp[x][y][nexT] = D + dp[x][y][t]
heapq.heappush( q,(dp[x][y][nexT] , x , y , nexT) )
print (-1)
SPD_9X2