[poj1678]I Love this Game!_博弈论

I Love this Game!

题目大意题目链接

注释:略。


想法

开始的时候以为没法dp,结果...:a>0啊!

所以可以直接dp了啊!

状态:dp[i]表示先手选了a[i]的状态。

转移:sb转移。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1010 
int sg[N],n,x,ans,m;
int SS[N];
int tot,to[N*N<<1],head[N],nxt[N*N<<1],cnt[N],num;
inline void add(int x,int y) {to[++tot]=y; nxt[tot]=head[x]; head[x]=tot;}
int dfs(int pos)
{
	if(sg[pos]!=-1) return sg[pos];
	bool vis[N];
	for(int i=0;i<n;i++) vis[i]=false;
	for(int i=head[pos];i;i=nxt[i]) vis[dfs(to[i])]=true;
	for(int i=0;;i++) if(!vis[i]) return sg[pos]=i;
}
int main()
{
	while(~scanf("%d",&n))
	{
		memset(sg,-1,sizeof sg);
		memset(head,0,sizeof head);
		memset(cnt,0,sizeof cnt);
		tot=0;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&num);
			for(int j=1;j<=num;j++)
			{
				scanf("%d",&x);
				add(i,x); 
				cnt[x]++;
			}
		}
		for(int i=0;i<n;i++) if(!cnt[i]) sg[i]=dfs(i);
		while(scanf("%d",&m)&&m)
		{
			ans=0;
			for(int i=1;i<=m;i++)
			{
				scanf("%d",&x);
				ans^=sg[x];
			} 
			if(ans) printf("WIN\n");
			else printf("LOSE\n");
		}
	}
}

小结:读题!

猜你喜欢

转载自www.cnblogs.com/ShuraK/p/9615082.html