您的位置:首页 > 其它

hdu 1536 (S-Nim) SG解法

2011-10-03 17:59 323 查看
这题折腾了好久,一直不知道怎么求解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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: