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 }

 

posted @ 2013-02-06 17:24  ACSeed  Views(121)  Comments(0)    收藏  举报