1. 程式人生 > >[poj1678]I Love this Game!_博弈論

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

++ win mem while sizeof 代碼 std his blank

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

小結:讀題!

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