背景:
•規則:有一堆n個物品,兩個人輪流從這堆物品中取物,
規定每次至少取乙個,最多取m個。
兩個人足夠聰明,最後取光者得勝。 問在
n確定的情況下如何確定兩人的勝敗情況。
思考過程:
最簡單的狀態:
狀態(1):n=m+1;先手可取1-m個物品,剩餘m-1個物品,所以後手必勝;
推論:狀態(2):n=(m+1)+1; 先手只要取1個物品此時轉化為狀態(1),無論後手取1-m個物品,先手可在第二次取盡,所以先手必勝;(注意狀態轉化是先後手改變)
狀態(3):n=(m+1)+s;先手只要取m個物品即可轉化為狀態(1),狀態(1)結果已知,可直接使用結果推出先手必勝
總結狀態(2)(3):
狀態(4):n=(m+1)+s;(1<=s<=m); 此時先手只要取s個物品即可轉化為狀態(1),先手必勝;
狀態(5):n=2(m+1);此時無論先手取1-m個,都會轉化為轉態(4),後手必勝
狀態(6):n=2(m+1)+s;此時先手只要取s個物品即可轉化為狀態(5),先手必勝
狀態(7):n=3(m+1);此時無論先手取1-m個都會轉化為狀態(6),後手必勝
狀態(8):n=3(m+1)+s;此時先手只要取s個則轉化為狀態(7),先手必勝
歸納:當n=k(m+1)+s時,k=任意自然數,;(1<=s<=m);先手每次只要取掉si個,保證每次給後手留下(m+1)的整數倍,則可必勝;
當n=k(m+1)時,後手必勝;
必勝必敗態理論:
所有終結點是必敗點
規則1:乙個狀態是必敗的狀態,當且僅當它的所有後繼狀態為必勝狀態
規則2:乙個狀態是必勝的狀態,當且僅當它的所有後繼狀態中至少有乙個是必敗狀態
應用例題:
ferguson
遊戲:進行遊戲需要用到兩個盒子,在遊戲的開始,第乙個盒子中有n枚石子,第二個盒子中有m個石子(n, m > 0,n+m<20)。參與遊戲的兩名玩家輪流執行這樣的操作:清空乙個盒子中的石子,然後從另乙個盒子中拿若干石子到被清空的盒子中(至少乙個),使得最後兩個盒子都不空。當兩個盒子中都只有一枚石子時,遊戲結束。最後成功執行操作的玩家獲勝。終態為[1,1]
根據必勝必敗態理論,[1,1]為必敗態,所有只要能推出乙個必敗態([1,1])的狀態為必勝態,所有能推出的子狀態都是必勝態的狀態為必敗態。
**解:
#include
using namespace std;
#define maxn 100
int main()
for(int k=3;k<20;k++){
for(int n=1;n
時間上應該還可以繼續優化
2.巴什博弈:
只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個。最後取光者得勝。
顯然,因此我們發現了如何取勝的法則:如果n=(m+1)r+s,(r為任意自然數,s≤m),那麼先取者要拿走s個物品,如果後取者拿走k(≤m)個,那麼先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麼先取者肯定獲勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。
對於巴什博奕,那麼我們規定,如果最後取光者輸,那麼又會如何呢?
(n-1)%(m+1)==0則後手勝利
先手會重新決定策略,所以不是簡單的相反行的
最簡單的狀態:n=1;先手必敗
(1)n=1+s,(1<=s<=m);先手只要取s個,後手必敗,先手必勝
(2)n=1+(m+1);無論先手取1-m個,都變為狀態(1),先手必敗;
(3)n=1+(m+1)+s;先手取s個,變為(2),先手必勝;
(4)n=1+2(m+1);無論先手取1-m個都變為(3),先手必敗;
(5)n=1+2(m+1)+s;先手取s個變為(4),先手必勝;
(6)n=1+3(m+1);無論先手取1-m個變為(5),先手必敗;
歸納 n=1+k(m+1)(k=任意自然數),先手必敗;//所以有(n-1)%(m+1)==0,後手必勝。
n=1+k(m+1)+s;先手必勝;
·nim遊戲
「要知道,像nim遊戲這種博弈問題,最重要的是尋找必敗態。這個必敗態的的意思就是,這樣一種局面擺在面前的話先手必敗。其嚴格定義如下:1.無法進行任何移動的局面是必敗態;2.可以移動到必敗態的局面是非必敗態;3.在必敗態做的所有操作的結果都是非必敗態。這個還是很好理解的吧,就是自己處在非必敗態上總能移動到必敗態把必敗態留給對方,而對方處在必敗態的話總是只能移動到非必敗態,把非必敗態留給自己,然後自己繼續虐對方。
而對於nim遊戲,局面是必敗態當且僅當所有堆硬幣的數量都異或起來結果為0,即a1^a2^...^an=0!!!為了證明之,我們只要證明它滿足上述必敗態的三條性質即可。
第乙個命題顯然,最終局面只有乙個,就是全0,異或仍然是0。
第二個命題,對於某個局面(a1,a2,...,an),若a1^a2^...^an!=0(不等號就用c++的習慣用!=來表示了),一定存在某個合法的移動,將ai改變成ai'後滿足a1^a2^...^ai'^...^an=0。不妨設a1^a2^...^an=k,則一定存在某個ai,它的二進位制表示在k的最高位上是1(否則k的最高位那個1是怎麼得到的)。這時ai^k第三個命題,對於某個局面(a1,a2,...,an),若a1^a2^...^an=0,一定不存在某個合法的移動,將ai改變成ai'後滿足a1^a2^...^ai'^...^an=0。因為異或運算滿足消去率,由a1^a2^...^an=a1^a2^...^ai'^...^an可以得到ai=ai'。所以將ai改變成ai'不是乙個合法的移動。證畢。
就這樣,乙個簡單而神奇的運算,就搞定了這麼個讓我絞盡腦汁也毫無頭緒的遊戲,而xor運算的出現,又是乍一看完全與問題毫不相干!這正是xor的奇妙之處,吸引人之處。
」--
一步一步理解GB GBDT xgboost
gbdt和xgboost在競賽和工業界使用都非常頻繁,能有效的應用到分類 回歸 排序問題,雖然使用起來不難,但是要能完整的理解還是有一點麻煩的。本文嘗試一步一步梳理gb gbdt xgboost,它們之間有非常緊密的聯絡,gbdt是以決策樹 cart 為基學習器的gb演算法,xgboost擴充套件和...
一步一步理解GB GBDT xgboost
gbdt和xgboost在競賽和工業界使用都非常頻繁,能有效的應用到分類 回歸 排序問題,雖然使用起來不難,但是要能完整的理解還是有一點麻煩的。本文嘗試一步一步梳理gb gbdt xgboost,它們之間有非常緊密的聯絡,gbdt是以決策樹 cart 為基學習器的gb演算法,xgboost擴充套件和...
一步一步教你開發《松鼠推箱子》手機遊戲
這類遊戲大家肯定都玩過,乙個很有趣味性的小遊戲。操作簡單,具有一定的邏輯性。很適合無聊的時候消遣時間。首先簡單介紹下手機遊戲的一般性開發過程。首先需要策劃出乙個遊戲方案,也就是要給出乙個遊戲的整體形象。當然是想象中的。比如 遊 戲題材,背景,操作方法,人物,與獎勵機制。然後對這個策劃方案進行可行性分...