結果
| 問題 | No.1916 Making Palindrome on Gird |
| コンテスト | |
| ユーザー |
lilictaka
|
| 提出日時 | 2022-04-29 23:10:32 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,823 bytes |
| 記録 | |
| コンパイル時間 | 1,846 ms |
| コンパイル使用メモリ | 81,792 KB |
| 実行使用メモリ | 83,968 KB |
| 最終ジャッジ日時 | 2024-06-29 04:53:04 |
| 合計ジャッジ時間 | 4,074 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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)]
dp[0][0] = 1
mod = 10 ** 9 + 7
for h in range(H):
for w in range(W):
if check(h-1,w):
if flag[h-1][w]:
dp[h][w] += dp[h-1][w]
if check(h,w-1):
if flag[h][w-1]:
dp[h][w] += dp[h][w-1]
dp[h][w] %= mod
print(dp[H-1][W-1])
lilictaka