spoj 3885

简单的博弈题,用dp解;

每个人只能拿1,l,k个硬币;

dp[i][j]表示第j个人拿是否能拿第i枚硬币;

代码:

 1 #include<cstdio>
 2 #define maxn 1000007
 3 using namespace std;
 4 bool dp[maxn][2];
 5 int x,l,m,k;
 6 
 7 int main()
 8 {
 9     scanf("%d%d%d",&k,&l,&m);
10     for(int i=1;i<=1000000;i++)
11         for(int j=0;j<2;j++)
12         {
13             dp[i][j]|=1-dp[i-1][j^1];
14             if(i>=l)dp[i][j]|=1-dp[i-l][j^1];
15             if(i>=k)dp[i][j]|=1-dp[i-k][j^1];
16         }
17     while(m--)
18     {
19         scanf("%d",&x);
20         printf("%c",'B'-dp[x][0]);
21     }
22     puts("");
23     return 0;
24 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3353333.html