å ´ããã«ã¼ããææã«å ¥ããªãæ¹ãè¯ãå ´åãããã®ããããï¼ããã¨ãå±é¢ç¶æ ãæ°å¤æ å ±ã«ã¨ã³ã³ã¼ãããããè¿·ã£ããã©ãã¨ã³ã³ã¼ãããªãã¦ãéã£ãã
åé¡æ¦è¦
ã¯ãããé«æ©åã¯æ´æ° ã®æ¸ããã
æã®ã«ã¼ããæã£ã¦ãã¦ãéæ¨åã¯æ´æ°
ã®æ¸ããã
æã®ã«ã¼ããæã£ã¦ãã¦ãå ´ã«ã¯æ´æ°
ã®æ¸ããã
æã®ã«ã¼ããããã
é«æ©åããã¯ããã¦ã交äºã«æ¬¡ã®æä½ãç¹°ãè¿ã
- ææã®ã«ã¼ãã 1 æé¸ãã§å ´ã«åºãï¼ãã®æ´æ°å¤ã
ã¨ããï¼
- å ´ã®ã«ã¼ããã 0 æã¾ã㯠1 æã®ã«ã¼ããé¸ã³ããã®ã«ã¼ãã®æ´æ°å¤ã
æªæºã§ãããªãã°ãææã«å ¥ããï¼
以ä¸ãªãã°ä½ãããªãï¼
å ã«æä½ãè¡ããªããªã£ãæ¹ãè² ãã§ãããåæ¹æåãå°½ãããã¨ããã©ã¡ããåã¤ãï¼
å¶ç´
ã²ã¼ã ã®åæãæ±ããåé¡ã§ã¯ãã¾ã DP ã§ããªããï¼ããèããã¨è¯ãã¨æããæ°ã«ãã¹ããã¤ã³ãã¯
- èããããå±é¢ã¯ä½éãããã®ãï¼
- æéåæ°ã§çµäºãããï¼ãï¼å±é¢ãã«ã¼ããããã¨ã¯ãªããï¼ï¼
ã¨ãã£ããã¨ã§ãããä»åã¯ã ã¨ãã¦ãé«ã
éãã®å±é¢ãããï¼åã«ã¼ãã«ã¤ãããé«æ©åã®ææããéæ¨åã®ææããå ´ãã®ã©ãã«ããã㧠3 éãããããï¼ã
ãªã®ã§ãç¾å®çãªæ°ã ã¨è¨ããã
ã¾ããã²ã¼ã ãé²ãã«ã¤ãã¦ããäºãã®ææã¡ã®ã«ã¼ãã®ææ°ãã¾ãã¯ãå ´ã®ã«ã¼ãã®æ´æ°ã®ç·åãã®å¤ãå調æ¸å°ã§ãããããå±é¢ãã«ã¼ããããã¨ã¯ãªãã
ãã£ã¦ããã¤ãã®ã²ã¼ã DP ãããã°ãããã²ã¼ã DP ã®ããæ¹ã¯ããã¨ãã°æ¬¡ã®è¨äºãªã©ã«æ¸ããã
è¨ç®é㯠ã¨ãªãï¼å±é¢æ°ã
åãé·ç§»ã
éãããããï¼ã
ã³ã¼ã
å±é¢ãæ´æ°å¤ã«ã¨ã³ã³ã¼ããããæ©ãã ãã©ãããã§ã¯
- é«æ©åã®ææã¡ã®ã«ã¼ãã®æ´æ°å¤
- éæ¨åã®ææã¡ã®ã«ã¼ãã®æ´æ°å¤
- å ´ã®ã«ã¼ãã®æ´æ°å¤
ã®çµããã¼ã¨ããï¼ã¡ã¢åããéã«ãmap<array<vector<int>, 3>, bool>
ã使ãï¼ã®ã§éã£ãã
#include <bits/stdc++.h> using namespace std; using Node = array<vector<int>, 3>; // ç¤é¢ã®ç¶æ int main() { int N, M, L; cin >> N >> M >> L; vector<int> A(N), B(M), C(L); for (int i = 0; i < N; i++) cin >> A[i]; for (int i = 0; i < M; i++) cin >> B[i]; for (int i = 0; i < L; i++) cin >> C[i]; // èªåã®ææã x, ç¸æã®ææã y, å ´ã®ã«ã¼ãã z ã§ããã¨ãã®åæï¼dp[{x, y, z}] ãæ±ãã map<Node, bool> dp; auto rec = [&](auto rec, Node v) -> bool { // çµäºç¶æ ãã©ããã®å¤å® if (v[0].empty()) return false; // ã¡ã¢åå帰ã®å¦ç if (dp.count(v)) return dp[v]; // å ´ã«ã«ã¼ããåºã bool res = false; for (int i = 0; i < v[0].size(); i++) { int val = v[0][i]; vector<int> nx = v[0], ny = v[1], nz = v[2]; nz.push_back(val); nx.erase(nx.begin() + i); sort(nz.begin(), nz.end()); // å ´ã«ããã«ã¼ããåããªãå ´å if (!rec(rec, Node({ny, nx, nz}))) res = true; // å ´ã«ããã«ã¼ããé ã«è©¦ã for (int j = 0; j < nz.size(); j++) { if (nz[j] >= val) break; vector<int> nx2 = nx, ny2 = ny, nz2 = nz; nx2.push_back(nz[j]); nz2.erase(nz2.begin() + j); sort(nx2.begin(), nx2.end()); if (!rec(rec, Node({ny2, nx2, nz2}))) res = true; } } return dp[v] = res; }; cout << (rec(rec, Node({A, B, C})) ? "Takahashi" : "Aoki") << endl; }