博弈论
开博!!!
取石头问题:取石子总结(博弈)_
关键点的结论:
- min博弈:^的结果为0, 先手输,不然赢(最后一个取完的人获胜);
- 先手能找到必输的情况 必赢,反之就输。
- 维持不变原则,然对方一直处于必败
SG函数 :
- 核心思路:利用SG来将问题转换为Min问题。
- 处理的时候就是 把sg看成一个有向图,这个点可以又哪些点进行更新过来,取集合中所没有的非负的最小数,以保证,我这个点可以选着任意个数(转化为取石头问题)
- 注意一些,特殊点,terminal point 等等,0(代表先手必输)
- 在转移的时候,更具题目的特殊要求,有一些点是不能转移的,要特判(转移过整个游戏就输了)
- 对于一些很多种条件的博弈,一样可以转化为多个图的sg来进行Min,拆分的思想。
代码:

void inint(){ sg[0][0]=0; for(ri i=1;i<=100;i++) { for(ri j=1;j<=100;j++) { 枚举每一个点, for(ri k=0;k<=200;k++) { flag[k]=0; 清零 } 在对这个点进行进行更新,看哪些点可以到达他 for(ri k=1;i-k>=1;k++) { if(i-k==j) continue; flag[sg[i-k][j]]=1; } for(ri k=1;j-k>=1;k++) { if(i==j-k) continue; flag[sg[i][j-k]]=1; } for(ri k=1;j-k>=1&&i-k>=1;k++) { flag[sg[i-k][j-k]]=1; } 来确定sg的值 for(ri k=0;;k++) { if(!flag[k]) { sg[i][j]=k; break;记住break } } } } }