結果
問題 | No.3071 Double Speedrun |
ユーザー |
👑 ![]() |
提出日時 | 2025-02-08 01:15:13 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 989 ms / 6,000 ms |
コード長 | 2,837 bytes |
コンパイル時間 | 982 ms |
コンパイル使用メモリ | 78,684 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2025-02-08 01:40:21 |
合計ジャッジ時間 | 10,281 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 14 |
ソースコード
#include <iostream>#include <string>#include <vector>using namespace std;using ll = long long;ll mod = 998244353;int main() {int H, W;cin >> H >> W;vector<string> S(H);for (int i = 0; i < H; i++) {cin >> S[i];}// dp[i][j] = (Alice の x 座標が i, Bob の x 座標が j)vector<vector<ll>> dp(H, vector<ll>(H, 0));dp[1][0] = 1;for (int i = 1; i < H + W - 2; i++) {vector<vector<ll>> ndp(H, vector<ll>(H, 0));for (int j = 1; j < H; j++) {for (int k = 0; k < j; k++) {int ax = j;int ay = i - j;int bx = k;int by = i - k;if (!(ax >= 0 && ax < H && ay >= 0 && ay < W && bx >= 0 &&bx < H && by >= 0 && by < W)) {continue;}if (ax + 1 < H && bx + 1 < H) {if (S[ax + 1][ay] != '#' && S[bx + 1][by] != '#') {if (i == H + W - 3 || ax + 1 > bx + 1) {ndp[j + 1][k + 1] += dp[j][k];if (ndp[j + 1][k + 1] >= mod) {ndp[j + 1][k + 1] -= mod;}}}}if (ax + 1 < H && by + 1 < W) {if (S[ax + 1][ay] != '#' && S[bx][by + 1] != '#') {if (i == H + W - 3 || ax + 1 > bx) {ndp[j + 1][k] += dp[j][k];if (ndp[j + 1][k] >= mod) {ndp[j + 1][k] -= mod;}}}}if (ay + 1 < W && bx + 1 < H) {if (S[ax][ay + 1] != '#' && S[bx + 1][by] != '#') {if (i == H + W - 3 || ax > bx + 1) {ndp[j][k + 1] += dp[j][k];if (ndp[j][k + 1] >= mod) {ndp[j][k + 1] -= mod;}}}}if (ay + 1 < W && by + 1 < W) {if (S[ax][ay + 1] != '#' && S[bx][by + 1] != '#') {if (i == H + W - 3 || ax > bx) {ndp[j][k] += dp[j][k];if (ndp[j][k] >= mod) {ndp[j][k] -= mod;}}}}}}for (int j = 0; j < H; j++) {for (int k = 0; k < H; k++) {dp[j][k] = ndp[j][k];}}}cout << dp[H - 1][H - 1] << endl;}