博弈類的核心在於獲取sg函式。
對於乙個局面,若至少有一種操作使它變為p局面,則它是n局面
對於乙個局面,無論如何操作都使它變為n局面,則它是p局面
將遊戲中間的狀態看做頂點,將狀態的轉移看做邊
sg(v) 定義為 沒有出現在中的最小自然數
初始節點(必須是p節點)沒有出邊,sg = 0.
若v有邊指向某sg(vi) = 0的vi,則sg(v)>0
若v沒有邊指向某sg(vi) = 0的vi,則sg(v) = 0
所有p節點sg = 0
所有n節點sg > 0
sg() = sg(n1)^sg(n2) 為兩個一維sg函式的異或
1. 將之間的空格數看作石子數,再進行
2. 階梯博弈,將棋子兩兩一對,若為奇數則將起點算入。可以理解為奇數區間內的兩個石子的移動可以通過更改轉換
分析這題的p/n點時,和往常不一樣,不是從小資料推測,而是直接從性質推測,從右往左,把棋子分為兩兩一組,如果是奇數顆棋子,就補第一顆的位置為0,當對手移動兩顆棋子的左邊的棋子時,我們只需要把右邊這顆棋子移動相同的步數就行,當對手移動右邊的棋子時,把兩顆棋子之間的距離看為石子的個數,我們只需按照取石子的規則走就行。
和取石子很像,和取石子的區別在於每一次移動時都會讓右邊相鄰的那顆棋子移動空間變大,這樣就和取石子只減不增有所不同了.
將棋子從右端向左端每相鄰兩個分為一對,如果只剩乙個就將棋盤左端加一格放一顆棋子與之配對,這樣配對後好像和以前沒有什麼區別,但決策時就方便多了,因為我們大可不必關心組與組之間的距離,當對手移動一組中靠左邊的棋子時,我們只需將靠右的那一顆移動相同步數即可!同時我們把每一組兩顆棋子的距離視作一堆石子,在對手移動兩顆棋子中靠右的那一顆時,我們就和他玩取石子遊戲,這樣就把本題與取石子對應上了。
本例說明有許多模型看似複雜,但經過一些巧妙的變換,便可以轉化成一些我們熟悉的模型,同時也充分體現了博弈的靈活。
如果說前面的例子是介紹這種思想的運用的話,下面的方法就是講這種思路的優越性了,因為這一題並不是走的「手推小資料=〉猜想=〉證明」的老路,而是直接利用性質推導必敗條件。
由於任何兩個相鄰的棋子只與他們之間的空位有關,所以可以轉化為普通的nim遊戲:我們可以把這些空位看作是石子數,誰取得了最後乙個空位,誰就是贏家
3. 1.nim遊戲
直接全部異或,0則後首勝,反之先手勝。求如何選取才能取勝
void solve()
; int i;
for(i=0; i
雙人博弈類dp總結
例項1 usaco a game 有一列數排列,甲乙兩個人每次可以從頭或者從末尾取乙個數,問甲乙在採取最優策略的基礎下分別分別得分是多少?這個題帶有一絲區間的味道,因此我們定義dp i j 為先取者所能取得的得分,然後我們思考對於當前的i j的序列甲先取的話有兩種取法,即1.從頭取,2.從末尾取,1...
函式模版和模版函式,類模版和模版類的區別
什麼是函式模板和類模板 函式模板是一種抽象函式定義,它代表一類同構函式。通過使用者提供的具體引數,c 編譯器在編譯時刻能夠將函式模板例項化,根據同乙個模板建立出不同的具體函式,這些函式之間的不同之處主要在於函式內部一些資料型別的不同,而由模板建立的函式的使用方法與一般函式的使用方法相同。函式模板的定...
hdu 1848 sg博弈模版題
計算從1 n範圍內的sg值。array 儲存可以走的步數,array 0 表示可以有多少種走法 array需要從小到大排序 1.可選步數為1 m的連續整數,直接取模即可,sg x x m 1 2.可選步數為任意步,sg x x 3.可選步數為一系列不連續的數,用getsg 計算 int sg max...