//HDU1848,SG函数,简单应用示例

原创 2016年08月28日 15:49:16

0

先理解怎么样用!然后再弄明白为什么这样用。

1

首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数

例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。


对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Grundy函数g如下:g(x)=mex{ g(y) | y是x的后继 },这里的g(x)即sg[x]


例如:取石子问题,有1堆n个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,那么各个数的SG值为多少?

sg[0]=0,f[]={1,3,4},


x=1时,可以取走1-f{1}个石子,剩余{0}个,mex{sg[0]}={0},故sg[1]=1;

x=2时,可以取走2-f{1}个石子,剩余{1}个,mex{sg[1]}={1},故sg[2]=0;

x=3时,可以取走3-f{1,3}个石子,剩余{2,0}个,mex{sg[2],sg[0]}={0,0},故sg[3]=1;

x=4时,可以取走4-f{1,3,4}个石子,剩余{3,1,0}个,mex{sg[3],sg[1],sg[0]}={1,1,0},故sg[4]=2;

x=5时,可以取走5-f{1,3,4}个石子,剩余{4,2,1}个,mex{sg[4],sg[2],sg[1]}={2,0,1},故sg[5]=3;

以此类推.....

   x         0  1  2  3  4  5  6  7  8....

sg[x]      0  1  0  1  2  3  2  0  1...


摘自http://blog.csdn.net/lttree/article/details/24886205

 

2

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>

//HDU1848,SG函数,简单应用示例
using namespace std;

int m,n,p;
bool bj[1010];
int sg[1010];
int fib[21];

void Get_sg(int t,int x){
    memset(sg,0,sizeof(sg));
    for(int i=1;i<=x;i++){//sg[0]=0
        memset(bj,0,sizeof(bj));
        for(int j=1;j<=t&&fib[j]<=i;j++){
            bj[sg[i-fib[j]]]=1;
        }
        for(int j=0;j<=x;j++){
            if(bj[j]==0){
                sg[i]=j;
                break;
            }
        }
    }
}
int main()
{
    fib[1]=1;fib[2]=2;
    for(int i=3;i<17;i++){//i==16,fib[i]==1597>1000
        fib[i]=fib[i-1]+fib[i-2];
    }
    Get_sg(16,1001);
    while(~scanf("%d%d%d",&n,&m,&p)&&(n+m+p)){
        //Get_sg(max(max(n,m),max(m,p))); 放在外面,Get一次即可
        if((sg[n]^sg[m]^sg[p])==0){///注意,^优先级低于==,所以不加括号则WA
            cout<<"Nacci"<<endl;
        }
        else{
            cout<<"Fibo"<<endl;
        }
    }
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU 1848 Fibonacci again and again(SG函数的应用)

原题:http://acm.hdu.edu.cn/showproblem.php?pid=1848

hdu1848(博弈SG函数初应用)

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1848 Fibonacci again and again Time Limit: 1000/1...

hdu 1848 SG函数应用

做了这题才知道所有的ICG游戏都可以转化为nim game来做,中间就是SG值,对SG值的理解还是不够深 就这题而言,题目数据不大,可以考虑直接求出单个游戏0-1000的所有SG值,最后取异...
  • HZXPH
  • HZXPH
  • 2011-08-07 15:56
  • 828

博弈(SG函数讲解及其应用)(hdu1848)

摘自jumping_frog聚聚的博客: 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如 mex{0,1,2,4}=3、m...

ACM-SG函数之Fibonacci again and again——hdu1848

ACM SG函数 Fibonacci again and again hdu1848

HDU 1848 Fibonacci again and again(学习sg函数后写出来的第一个题)

HDU1848 Fibonacci again and againDescription

HDU 1848 Fibonacci again and again 博弈论SG函数

Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja...

HDU1848 Fibonacci again and again SG函数

题目链接:HDU1848 Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit:...

hdu 1848 Fibonacci again and again 博弈论,求出SG函数,,什么问题都没有了

Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)=2; F(n)=F(n-1)+F(...

HDU 1848 Fibonacci again and again【博弈:SG函数】

Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)