[poj1678]I Love this Game!_博弈論
阿新 • • 發佈:2018-09-09
++ 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!_博弈論