結果
| 問題 | 
                            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