poj2086 博弈论+dp

来源:互联网 发布:mysql数据库的触发器 编辑:程序博客网 时间:2024/06/10 18:23

看到这道题就懵了,怎么用sg函数异或啊??
看了题解才发现,原来博弈论也可以结合dp做!
结合了dp就很简洁易懂了,P(必败点)的后继结点一定是N(必胜点),所有后继结点都是N,那么这个点就是P

#include<cstdio>#include<cstring> using namespace std;int a[25],dp[25][(2<<13)+5];int n,s;int dfs(int x,int left){    if(x>2*n) x=1;    if(dp[x][left]!=-1) return dp[x][left];    for(int i=1;i<=a[x];i++){        if(left<i) break;        if(!dfs(x+1,left-i)) return dp[x][left]=1;    }    return dp[x][left]=0;}int main(){    while(scanf("%d",&n)&&n){        memset(dp,-1,sizeof(dp));        scanf("%d",&s);        for(int i=1;i<=2*n;i++){            scanf("%d",&a[i]);            dp[i][0]=1;//必胜态         }        printf("%d\n",dfs(1,s));    }    return 0;}
原创粉丝点击