King Bombee
問題
E – King Bombee
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/3/22 バーチャル参加 解法わからず。
解法
- dp[i][v][b] := Sからi回移動したときに、vの位置にいて、Xの回数 % 2がbのときの通り数(あとで直す)
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 62; // const int INF = 1001001001; mint dp[2010][2010][2]; int main() { int N, M, K, S, T, X; cin >> N >> M >> K >> S >> T >> X; S--; X--; T--; vector<vector<int>> graph(N + 1); rep(i, M) { int U, V; cin >> U >> V; U--; V--; graph[U].push_back(V); graph[V].push_back(U); } dp[0][S][0] = 1; for(int i = 0; i < K; ++i) { for(int v = 0; v <= N; ++v) { for(int b = 0; b < 2; ++b) { int n = graph[v].size(); for(int t = 0; t < n; ++t) { int to = graph[v][t]; int b2 = b; if(to == X) { b2 = (b + 1) % 2; } dp[i + 1][to][b2] += dp[i][v][b]; } } } } cout << dp[K][T][0].val() << endl; return 0; }