結果
問題 | No.611 Day of the Mountain |
ユーザー | vwxyz |
提出日時 | 2022-04-28 02:42:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,366 ms / 2,017 ms |
コード長 | 2,422 bytes |
コンパイル時間 | 180 ms |
コンパイル使用メモリ | 81,912 KB |
実行使用メモリ | 258,820 KB |
最終ジャッジ日時 | 2024-06-28 07:52:20 |
合計ジャッジ時間 | 6,742 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 991 ms
258,648 KB |
testcase_01 | AC | 940 ms
258,820 KB |
testcase_02 | AC | 1,252 ms
258,372 KB |
testcase_03 | AC | 1,366 ms
255,520 KB |
testcase_04 | AC | 72 ms
70,664 KB |
testcase_05 | AC | 63 ms
67,072 KB |
testcase_06 | AC | 43 ms
54,400 KB |
testcase_07 | AC | 44 ms
54,272 KB |
testcase_08 | AC | 78 ms
73,344 KB |
testcase_09 | AC | 40 ms
52,992 KB |
testcase_10 | AC | 40 ms
52,992 KB |
testcase_11 | AC | 52 ms
61,824 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: A[h][w]=int(A[h][w]) d=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 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]==1 and A[0][w]=="?": 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]: if A[h][w]=="?": 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] dp[bit>>1|1<<W-1]%=mod dp[bit>>1]%=mod else: dp[bit>>1]+=9*prev[bit] dp[bit>>1]%=mod else: 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] dp[bit>>1|1<<W-1]%=mod else: dp[bit>>1]+=prev[bit] dp[bit>>1]%=mod else: if A[h][w]=="?": dp[bit>>1]+=prev[bit]*9 dp[bit>>1]%=mod else: dp[bit>>1]+=prev[bit] dp[bit>>1]%=mod ans=0 for bit in range(1<<W-1,1<<W): ans+=dp[bit] ans%=mod print(dist[H-1][W-1]) print(ans)