您的位置:首页 > 其它

UVA - 10404 Bachet's Game

2013-09-13 21:01 519 查看
题意:给n个石头,m 种取法,Stan先取,Ollie后取,取到最后一块的获胜,问谁赢了,首先我们想想怎么能让Stan获胜,一定是Ollie取完后,我们可以通过m种取法中的一种使得Stan拿到最后一块,那么我们用dp[i] = 1表示Stan赢,0为输,那么一定有dp[n-arr[i] ] == 0,那么Stan 就赢了,推广到一般的情况是只要dp[i-arr[j]] == 0,那么我们就可以说在i个石头的情况下Stan赢了,这样我们就得到了状态转移方程
if(i>=arr[j] && dp[i-arr[j]]==0)dp[i]=1; 所以我们第一块石头开始判断,只要dp
== 1 ,那么Stan 就是赢家

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1000005;

int dp[MAXN];
int arr[MAXN];
int n,m;

int main(){
    while (scanf("%d%d",&n,&m) != EOF){
        memset(dp,0,sizeof(dp));
        for (int i = 1; i <= m; i++){
            scanf("%d",&arr[i]);
            dp[arr[i]] = 1;
        }
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                if (i >= arr[j] && !dp[i-arr[j]]){
                    dp[i] = 1;
                    break;
                }
        if (dp
)
            printf("Stan wins\n");
        else printf("Ollie wins\n"); 
    }      
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: