C++の練習を兼ねて, AtCoder Beginner Contest 265 の 問題E (Warp) を解いてみた.
■感想.
1. 問題E は, 方針が見えなかったので, 解説を参考にして, ようやく, AC版に到達出来た.
2. 問題E で, 苦手な動的計画法の訓練を積めたので, 非常に良かったと思う.
3. 引き続き, 時間を見つけて, 過去問の学習を進めていきたいと思う.
本家のサイト AtCoder Beginner Contest 265 解説 の 各リンク を ご覧下さい.
■C++版プログラム(問題E/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
// 解き直し. // https://atcoder.jp/contests/abc265/editorial/4587 // C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using LL = long long; using P = pair<LL, LL>; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) const LL MOD = 998244353; LL dp[303][303][303]; int main(){ // 1. 入力情報. int N, M; LL A, B, C, D, E, F; scanf("%d %d %lld %lld %lld %lld %lld %lld", &N, &M, &A, &B, &C, &D, &E, &F); set<P> st; rep(i, M){ LL x, y; scanf("%lld %lld", &x, &y); st.insert({x, y}); } // 2. dp更新. dp[0][0][0] = 1; rep(n, N){ rep(o1, n + 1){ rep(o2, n + 1 - o1){ // 3 種類のワープを, o1回, o2回, o3回 使った場合. int o3 = n - o1 - o2; LL x = A * o1 + C * o2 + E * o3; LL y = B * o1 + D * o2 + F * o3; // 移動可能か? if(!st.count({x, y})){ // ワープ 1. if(!st.count({x + A, y + B})){ dp[n + 1][o1 + 1][o2] += dp[n][o1][o2]; dp[n + 1][o1 + 1][o2] %= MOD; } // ワープ 2. if(!st.count({x + C, y + D})){ dp[n + 1][o1][o2 + 1] += dp[n][o1][o2]; dp[n + 1][o1][o2 + 1] %= MOD; } // ワープ 3. if(!st.count({x + E, y + F})){ dp[n + 1][o1][o2] += dp[n][o1][o2]; dp[n + 1][o1][o2] %= MOD; } } } } } // 3. 集計. LL ans = 0; rep(o1, N + 1){ rep(o2, N + 1){ ans += dp[N][o1][o2]; ans %= MOD; } } // 4. 出力. printf("%lld\n", ans); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
[入力例] 2 2 1 1 1 2 1 3 1 2 2 2 [出力例] 5 ※AtCoderテストケースより [入力例] 10 3 -1000000000 -1000000000 1000000000 1000000000 -1000000000 1000000000 -1000000000 -1000000000 1000000000 1000000000 -1000000000 1000000000 [出力例] 0 ※AtCoderテストケースより [入力例] 300 0 0 0 1 0 0 1 [出力例] 292172978 ※AtCoderテストケースより [入力例] 5 10 11 33 -25 18 23 -31 -31 -41 -16 38 -17 14 50 -30 -27 5 -39 48 9 20 -6 9 36 24 -23 -48 [出力例] 153 [入力例] 8 20 20 21 -22 -23 24 25 48 50 -298 -152 88 92 370 249 60 63 -100 147 253 11 20 21 316 -321 -204 498 -114 -40 -20 -21 255 176 261 -410 404 222 26 -81 -83 -253 -430 -415 -489 -172 179 263 [出力例] 1698 [入力例] 12 50 31 -41 -59 26 53 58 328 333 -324 302 -33 130 245 165 93 -123 148 424 138 439 -85 -406 -108 52 469 -489 -146 -119 -132 -39 -403 213 386 240 106 114 -231 -155 -22 61 -99 -389 290 -186 -241 333 354 19 326 -386 -293 -182 344 166 -154 -401 -119 318 7 476 291 -173 341 213 158 -409 -80 -106 136 -348 -350 110 56 68 150 286 72 185 493 252 176 -256 61 151 456 478 140 19 -46 237 -229 224 143 -75 -360 322 50 -51 202 -63 274 -167 159 -86 -74 222 [出力例] 369324 |
■参照サイト
AtCoder Beginner Contest 265