博弈
一、巴什博弈
?巴什博弈的題目一般是有一堆物品共n個,兩個人輪流取物品,每次只能取1~m個。最后取光者勝利。
解題方法:
?res=n%(m+1);
??若res=0,則先取者必敗,反之,后取者必敗。
拓展:
?若題目為先取完者失敗,則res=(n-1)%(m+1);
?當res=0時后取者勝利。
二、威佐夫博弈
?威佐夫博弈題目一般有兩堆數量若干的東西,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品。
?規定每次至少取一個,多者不限,最后取光者得勝。
?解題方法:
??面對非奇異局勢,先拿者必勝,反之,后拿者取勝。
?對于奇異局勢的判斷:
?若兩堆東西的數量(a,b)滿足
?ak=[k(1+sqrt(5.0))/2];
??bk=ak+k;?
??則此時局面為奇異局勢。
三、Nim博弈
?有三堆(或多堆)若干個物品,兩個人輪流從某一堆取任意多的物品。
?規定每次至少取一個,多者不限,最后取光者得勝。
?解題方法:
?將所有堆物品的數量進行異或操作,最后結果若為0,則先取者必敗,結果非零,則先取者必勝。
四、公平組合博弈
?SG函數:
?
int f[N],SG[MAXN],S[MAXN]; void getSG(int n) {memset(SG,0,sizeof(SG));for(int i = 1; i <= n; i++){memset(S,0,sizeof(S));for(int j = 0; f[j] <= i && j <= N; j++)S[SG[i-f[j]]] = 1; for(int j = 0;; j++) if(!S[j]){SG[i] = j;break;}} }
總結
- 上一篇: java中ofd文件转pdf_java
- 下一篇: java程序源代码如何保存到桌面_如何编