結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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])

       
0