結果

問題 No.3071 Double Speedrun
ユーザー 👑 seekworser
提出日時 2025-02-07 22:18:40
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,184 bytes
コンパイル時間 3,474 ms
コンパイル使用メモリ 287,316 KB
実行使用メモリ 11,572 KB
最終ジャッジ日時 2025-02-08 01:40:17
合計ジャッジ時間 44,034 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 10 TLE * 4
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#pragma GCC target ("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <atcoder/modint.hpp>
using namespace std;
using mint = atcoder::modint998244353;

// TLE
int main() {
    int h,w; cin >> h >> w;
    vector<string> s(h);
    for (int i=0; i<h; i++) cin >> s[i];
    vector dp(h, vector<mint>(h, mint(0)));
    dp[0][0] = 1;
    // dp[i][j][k]: i列目まで決めて、Aliceがその列で到達した最大の行がj、Bobがその行で到達した最小の行がk
    // 遷移は累積和で高速化しない場合、O(H^3W)
    for (int i=1; i<w; i++) {
        vector dpn(h, vector<mint>(h, mint(0)));
        for (int j=0; j<h; j++) for (int k=j+1; k<h; k++) {
            if (s[j][i] == '#' || s[k][i] == '#') continue;
            if (j > 0 && dpn[j-1][k].val() != 0) dpn[j][k] += dpn[j-1][k];
            for (int l=k; l>=0; l--) {
                if (s[l][i-1] == '#') break;
                if (dp[j][l].val() != 0) dpn[j][k] += dp[j][l];
            }
        }
        swap(dp, dpn);
    }
    cout << dp[h-2][h-1].val() << '\n';
}
0