結果
問題 | No.611 Day of the Mountain |
ユーザー | vwxyz |
提出日時 | 2022-04-28 02:33:21 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,554 ms / 2,017 ms |
コード長 | 2,276 bytes |
コンパイル時間 | 162 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 258,664 KB |
最終ジャッジ日時 | 2024-06-28 07:51:34 |
合計ジャッジ時間 | 8,119 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,466 ms
258,368 KB |
testcase_01 | AC | 1,223 ms
258,376 KB |
testcase_02 | AC | 1,554 ms
258,664 KB |
testcase_03 | AC | 1,252 ms
255,008 KB |
testcase_04 | AC | 69 ms
71,420 KB |
testcase_05 | AC | 62 ms
68,096 KB |
testcase_06 | AC | 43 ms
54,656 KB |
testcase_07 | AC | 46 ms
54,400 KB |
testcase_08 | AC | 75 ms
72,064 KB |
testcase_09 | AC | 41 ms
52,992 KB |
testcase_10 | AC | 40 ms
52,736 KB |
testcase_11 | AC | 50 ms
62,080 KB |
ソースコード
import sys readline=sys.stdin.readline H,W=map(int,readline().split()) A=[list(readline().rstrip()) for h in range(H)] if H<W: A=[[A[h][w] for h in range(H)] for w in range(W)] H,W=W,H inf=1<<30 dist=[[inf]*W for h in range(H)] if A[0][0]=="?": dist[0][0]=1 else: dist[0][0]=int(A[0][0]) for h in range(H): for w in range(W): if A[h][w]=="?": d=1 else: d=int(A[h][w]) if h: dist[h][w]=min(dist[h][w],dist[h-1][w]+d) if w: dist[h][w]=min(dist[h][w],dist[h][w-1]+d) B=[[0]*W for h in range(H)] B[H-1][W-1]=1 for h in range(H-1,-1,-1): for w in range(W-1,-1,-1): if B[h][w]: if A[h][w]=="?": d=1 else: d=int(A[h][w]) if h and dist[h-1][w]+d==dist[h][w]: B[h-1][w]=1 if w and dist[h][w-1]+d==dist[h][w]: B[h][w-1]=1 for h in range(H): for w in range(W): if B[h][w]: if A[h][w]=="?": B[h][w]=2 else: A[h][w]=int(A[h][w]) mod=201712111 dp=[0]*(1<<W) for w in range(1,W+1): if all(B[0][ww] for ww in range(w)): if w==W or B[0][w]==0: dp[(1<<w)-1]=pow(9,A[0][w:].count("?"),mod) elif B[0][w]==2: dp[(1<<w)-1]=pow(9,A[0][w+1:].count("?"),mod)*8%mod for hw in range(W+1,H*W+1): h,w=divmod(hw-1,W) prev=dp dp=[0]*(1<<W) for bit in range(1<<W): if B[h][w]==1: if w and bit&1<<W-1 and dist[h][w-1]+A[h][w]==dist[h][w] or bit&1 and dist[h-1][w]+A[h][w]==dist[h][w]: dp[bit>>1|1<<W-1]+=prev[bit] else: dp[bit>>1]+=prev[bit] elif B[h][w]==2: if w and bit&1<<W-1 and dist[h][w-1]+1==dist[h][w] or bit&1 and dist[h-1][w]+1==dist[h][w]: dp[bit>>1|1<<W-1]+=prev[bit] dp[bit>>1]+=8*prev[bit] else: dp[bit>>1]+=9*prev[bit] else: if A[h][w]=="?": dp[bit>>1]+=prev[bit]*9 else: dp[bit>>1]+=prev[bit] for bit in range(1<<W): dp[bit]%=mod ans=sum(dp[bit] for bit in range(1<<W) if bit&1<<W-1)%mod print(dist[H-1][W-1]) print(ans)