Nim
Description Let‘s play a traditional game Nim. You and I are seated across a table and we have a hundred stones on the table (we know the number of stones exactly). We play in turn and at each turn, you or I can remove on to four stones from the heap. You play first and In this game, you have a winning strategy. To see this, you first remove four stones and leave 96 stones. No matter how I play, I will end up with leaving 92 - 95 stones. Then you will in turn leave 91 stones for me (verify this is always possible). This way, Let‘s generalize the game a little bit. First, let‘s make it a team game. Each team has n players and the 2n players are seated around the table, with each player having opponents at both sides. Turn around the table so the two teams play alternately. Second, In general, when played between two teams of experts, the outcome of a game is completely determined by the initial number of stones and the maximum number of stones each player can take at each turn. In other words, either team has a winning strategy. You are the head-coach of a team. In each game, the umpire shows both teams the initial number of stones and the maximum number of stones each player can take at each turn. Your team plays first. Your job is, given those numbers, to instantaneously judge whether Incidentally, there is a rumor that Captain Future and her officers of Hakodate-maru love this game, and they are killing their time playing it during their missions. You wonder where the stones are? Well, they do not have stones but do have plenty of balls Input The input is a sequence of lines, followed by the last line containing a zero. Each line except the last is a sequence of integers and has the following format. n S M1 M2 . . . M2n where n is the number of players in a team, S the initial number of stones, and Mi the maximum number of stones ith player can take. 1st, 3rd, 5th, ... players are your team‘s players and 2nd, 4th, 6th, ... the opponents. Numbers are separated by a single space Output The output should consist of lines each containing either a one, meaning your team has a winning strategy, or a zero otherwise. Sample Input 1 101 4 4 1 100 4 4 3 97 8 7 6 5 4 3 0 Sample Output 0 1 1 Source |
题目:有两个队从石堆中去石子,每个队有n个人,每个人每次取石子的数量有限制,然后
取最后一块的人所在的队伍输。现在问第一队(成员为1,3,5,7...)是否能够赢得比赛。
思路 :dp[i][j]表示第i个人取,石堆剩余 j 块石头。当j为0的时候,没有石头,这时候是胜,为1。
后继中有必败态的为必胜态。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int M=1<<14; const int maxn=50; int dp[maxn][M],a[maxn],tol,n; void initial() { memset(dp,-1,sizeof(dp)); } void input() { scanf("%d",&tol); for(int i=0;i<2*n;i++) scanf("%d",&a[i]); } int DP(int x,int num) { if(dp[x][num]!=-1) return dp[x][num]; if(num==0) return dp[x][num]=1; dp[x][num]=0; for(int i=1;i<=a[x] && i<=num;i++) if(!DP((x+1)%(2*n),num-i)) dp[x][num]=1; return dp[x][num]; } int main() { while(scanf("%d",&n)!=EOF) { if(n==0) break; initial(); input(); printf("%d\n",DP(0,tol)); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。