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 "); else printf("LOSE "); } } }
小结:读题!