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

版权声明:本文为博主原创文章,你们可以随便转载 https://blog.csdn.net/Jaihk662/article/details/75729640

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;
}


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页