結果
| 問題 |
No.2003 Frog on Grid
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 14:52:40 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,614 bytes |
| コンパイル時間 | 205 ms |
| コンパイル使用メモリ | 82,884 KB |
| 実行使用メモリ | 84,516 KB |
| 最終ジャッジ日時 | 2025-06-12 14:55:46 |
| 合計ジャッジ時間 | 4,677 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 9 TLE * 1 -- * 16 |
ソースコード
import sys
MOD = 998244353
def main():
H, W, K = map(int, sys.stdin.readline().split())
grid = [sys.stdin.readline().strip() for _ in range(H)]
# 转换为0-based索引
grid = [list(row) for row in grid]
dp = [[0] * W for _ in range(H)]
pre = [[0] * W for _ in range(H)]
# 初始化起点
if grid[0][0] == '.':
dp[0][0] = 1
else:
print(0)
return
# 前缀和初始化
pre[0][0] = dp[0][0]
for i in range(H):
for j in range(W):
if i == 0 and j == 0:
continue
# 计算当前点的前缀和
pre[i][j] = dp[i][j]
if i > 0:
pre[i][j] += pre[i-1][j]
pre[i][j] %= MOD
if j > 0:
pre[i][j] += pre[i][j-1]
pre[i][j] %= MOD
if i > 0 and j > 0:
pre[i][j] -= pre[i-1][j-1]
pre[i][j] %= MOD
for i in range(H):
for j in range(W):
if i == 0 and j == 0:
continue
if grid[i][j] == '#':
dp[i][j] = 0
continue
max_s = K
total = 0
# 找到最小的i'和j',使得i' >= i - max_a, j' >= j - max_b
# 其中max_a + max_b <= K
# 我们需要计算区域 (i' >= i - a, j' >= j - b),a + b <= K
# 这个区域可以用前缀和数组来计算
min_i = max(0, i - K)
min_j = max(0, j - K)
# 我们需要找到所有点 (x, y) 满足 x >= i - K, y >= j - K, 且 (i - x) + (j - y) <= K
# 这个条件可以重写为 x >= i - (K - (j - y))
# 但这样处理可能比较复杂,因此我们采用暴力枚举的方式,这在K较小时是可行的
# 注意:这里可能需要优化,但暂时假设K不是非常大
# 枚举a的可能值
for a in range(0, K+1):
max_b = K - a
for b in range(0, max_b+1):
x = i - a
y = j - b
if x >= 0 and y >= 0 and grid[x][y] == '.':
total += dp[x][y]
total %= MOD
dp[i][j] = total % MOD
# 更新前缀和数组
pre[i][j] = (pre[i-1][j] if i > 0 else 0) + (pre[i][j-1] if j > 0 else 0) - (pre[i-1][j-1] if i > 0 and j > 0 else 0) + dp[i][j]
pre[i][j] %= MOD
print(dp[H-1][W-1] % MOD)
if __name__ == "__main__":
main()
gew1fw