1500 - Alice and Bob
根据1的个数划分状态, 根据必胜态后必有一个必败态进行转移。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 6 const int maxn = 100; 7 int dp[maxn][55000]; 8 9 int DP(int a, int b) { 10 if(dp[a][b] != -1) return dp[a][b]; 11 if(b == 1) return dp[a][b] = DP(a + 1, 0); 12 dp[a][b] = 0; 13 if(a > 0 && !DP(a - 1, b)) dp[a][b] = 1; 14 if(b > 0 && !DP(a, b - 1)) dp[a][b] = 1; 15 if(a >= 2 && ((b > 0 && !DP(a - 2, b + 3)) || (b == 0 && !DP(a - 2, 2)))) dp[a][b] = 1; 16 if(a && b && !DP(a - 1, b + 1)) dp[a][b] = 1; 17 return dp[a][b]; 18 } 19 20 int main() { 21 memset(dp, -1, sizeof(dp)); 22 int T;cin >> T; 23 for(int kase = 1; kase <= T; ++kase) { 24 int n; 25 cin >> n; 26 int A = 0, B = 0; 27 for(int i = 0; i < n; ++i) { 28 int a; 29 cin >> a; 30 if(a == 1) ++A; 31 else B += a + 1; 32 } 33 if(B) --B; 34 int ans = DP(A, B); 35 cout << "Case #" << kase << ": "; 36 if(ans) cout << "Alice" << endl; 37 else cout << "Bob" << endl; 38 } 39 return 0; 40 }


浙公网安备 33010602011771号