题意
两个队伍,每支队伍有n名队员交错入座,单次分别能最多取走Mi块石头,取走S块石头中的最后一块的队伍失败,求第一支队伍是否有必胜策略
思路
DP博弈。
dp[i][j][s] 第 i 队第 j 名队员取时剩下 s,此时是否必胜。
s = 0 时是必胜态。
第 i 队第 j 名队员从此状态出发, 能达到的状态中存在下一个取的队员(对方)的必败态,则此状态为必胜态。否则为必败态。
链接
http://poj.org/problem?id=2068
代码
#include<cstdio>
#include<cstring>
using namespace std;
const int maxs = 1 << 13;
int n, s;
int M[2][12];
bool win[2][12][maxs];
bool solve(){
memset(win, false, sizeof win);
for(int i = 0; i <= s; ++i){
for(int j = 0; j < 2; ++j){
for(int k = 0; k < n; ++k){
if(i == 0) win[j][k][i] = true;
int nj = j ^ 1, nk = (j == 1 ? (k + 1) % n : k);
for(int t = 1; t <= M[j][k] && i - t >= 0; ++t){
win[j][k][i] |= !win[nj][nk][i - t];
}
}
}
}
return win[0][0][s];
}
int main(){
while(scanf("%d", &n) == 1 && n){
scanf("%d", &s);
for(int i = 0; i < n; ++i){
scanf("%d %d", M[0] + i, M[1] + i);
}
if(solve()) puts("1");
else puts("0");
}
return 0;
}