hdu 1536 (S-Nim) SG解法

这题折腾了好久,一直不知道怎么求解SG,感觉用递归的方法会超时,最后看代码,采用记忆某些已知的SG的方式,递归求解。其中还爆内存两次,是因为递归中的数组空间开辟过大,递归层次多了,很容易爆的。

code:

#include <iostream>
#include <algorithm>
using namespace std;

int SG[10001];
int setNum;
int set[101];
int M,N;

int getSG(int value)
{
	int i =0 ;
	bool mex[101]={0};

	for (i = 0 ; i < setNum ; i++)
	{
		int temp = value - set[i];

		if (temp < 0)
			break;
		if (SG[temp] == -1)
			SG[temp] = getSG(temp);
		mex[SG[temp]] = true;
	}

	for (i = 0 ; ; i++)
		if (!mex[i])
			break;
	return i;
}
int main()
{
	int temp ;
	while (cin>>setNum && setNum)
	{   
		memset(SG,-1,sizeof(SG));
		SG[0]=0;

		for(int i =0 ; i < setNum ; i++)
		{
			cin>>set[i];
		}
        sort(set,set+setNum);

		cin>>M;
		while(M--)
		{
			int ans =0 ;
			cin>>N;
			for (int i =0 ; i < N ; i++)
			{   
				cin>>temp;
				if(SG[temp] == -1)
					SG[temp] = getSG(temp);

				ans^=SG[temp];
			}
			if (ans)
				cout<<"W";
			else 
				cout<<"L";
		}
		cout<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值