結果
| 問題 |
No.1916 Making Palindrome on Gird
|
| コンテスト | |
| ユーザー |
lilictaka
|
| 提出日時 | 2022-04-29 23:27:15 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,871 bytes |
| コンパイル時間 | 213 ms |
| コンパイル使用メモリ | 82,324 KB |
| 実行使用メモリ | 84,568 KB |
| 最終ジャッジ日時 | 2024-06-29 05:12:47 |
| 合計ジャッジ時間 | 4,507 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 11 WA * 19 |
ソースコード
from collections import deque
H,W = map(int,input().split())
S = []
edge = [[[] for _ in range(W)] for _ in range(H)]
IN = [[0] * W for _ in range(H)]
flag = [[False] * W for _ in range(H)]
def check(h,w):
if 0 <= h < H and 0 <= w < W:
return True
else:
return False
def e(h,w,t):
for dh,dw in [(-1,0),(1,0),(0,1),(0,-1)]:
nh = h + dh
nw = w + dw
if check(nh,nw) :
if flag[nh][nw]:
if t == 0:
edge[h][w].append((nh,nw))
IN[nh][nw] += 1
else:
edge[nh][nw].append((h,w))
IN[h][w] += 1
for _ in range(H):
s = list(map(lambda x:ord(x) - ord('a') ,list(input())))
S.append(s)
def solve():
for i in range((H+W-2)//2 + 1):
k = (H + W -2)//2 - i
left = set()
right = set()
for h in range(max(0,k-(W-1)),min(H-1,k) + 1):
w = k - h
left.add(S[h][w])
rk = (H+W-2 + 1)//2 + i
for h in range(max(0,rk-(W-1)),min(H-1,rk) + 1):
w = rk - h
right.add(S[h][w])
for h in range(max(0,k-(W-1)),min(H-1,k) + 1):
w = k - h
if S[h][w] in right:
flag[h][w] = True
e(h,w,0)
for h in range(max(0,rk-(W-1)),min(H-1,rk) + 1):
w = rk - h
if S[h][w] in left:
flag[h][w] = True
e(h,w,1)
solve()
dp = [[0] * W for _ in range(H)]
cnt = [[0] * W for _ in range(H)]
dp[0][0] = 1
mod = 10 ** 9 + 7
q = deque()
seen = [[False] * W for _ in range(H)]
q.append((0,0))
while q:
h,w = q.popleft()
for nh,nw in edge[h][w]:
dp[nh][nw] += dp[h][w]
dp[nh][nw] %= mod
if not seen[nh][nw]:
q.append((nh,nw))
seen[nh][nw] = True
print(dp[H-1][W-1])
lilictaka