bzoj 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(SG函数)

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏

Time Limit: 3 Sec   Memory Limit: 128 MB
Submit: 181   Solved: 124
[ Submit][ Status][ Discuss]

Description

    贝茜和约翰在玩一个数字游戏.贝茜需要你帮助她.
    游戏一共进行了G(1≤G≤100)场.第i场游戏开始于一个正整数Ni(l≤Ni≤1,000,000).游
戏规则是这样的:双方轮流操作,将当前的数字减去一个数,这个数可以是当前数字的最大数码,也可以是最小的非0数码.比如当前的数是3014,操作者可以减去1变成3013,也可以减去4变成3010.若干次操作之后,这个数字会变成0.这时候不能再操作的一方为输家.    贝茜总是先开始操作.如果贝茜和约翰都足够聪明,执行最好的策略.请你计算最后的赢家.
    比如,一场游戏开始于13.贝茜将13减去3变成10.约翰只能将10减去1变成9.贝茜再将9减去9变成0.最后贝茜赢.

Input

    第1行输入一个整数G,之后G行一行输入一个Ni.

Output

    对于每一场游戏,若贝茜能赢,则输出一行“YES”,否则输幽一行“NO”

Sample Input

2
9
10

Sample Output

YES
NO


丢史蒂芬妮一模一样

记忆化搜索或SG打表

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[1000005];
int Sech(int x)
{
	int temp, mn, mx;
	if(dp[x]!=-1)
		return dp[x];
	temp = x;
	mn = 10, mx = 0;
	while(temp)
	{
		if(temp%10!=0)
		{
			mn = min(mn, temp%10);
			mx = max(mx, temp%10);
		}
		temp /= 10;
	}
	if(Sech(x-mn)==0 || Sech(x-mx)==0)
		dp[x] = 1;
	else
		dp[x] = 0;
	return dp[x];
}
int main(void)
{
	int T, n;
	memset(dp, -1, sizeof(dp));
	dp[0] = 0;
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d", &n);
		if(Sech(n))
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值