演算法(37) 暴力遞迴(4) 紙牌博弈 c

2021-10-02 17:09:57 字數 1090 閱讀 2856

題目:有乙個整型陣列a,代表數值不同的紙牌排成一條線。玩家a和玩家b依次拿走每張紙牌,規定玩家a先拿,玩家b後拿,但是每個玩家每次只能拿走最左或最右的紙牌,

請返回最後獲勝者的分數。

思路:暴力遞迴,典型的「範圍」上嘗試的模型

上**#include #include #include #include using namespace std;

typedef vectormyvci;

int s(myvci arr, int l, int r);

//先手選擇

int f(myvci arr, int l, int r)

return max(arr[l] + s(arr, l + 1, r), 先手 選最大的 i j+1是後手

arr[r] + s(arr, l, r - 1));

}//後手函式

int s(myvci arr, int l, int r)

return min(f(arr, l + 1, r),//對手在拿 所以不加 arr[i] 對手讓你選後續最小值

f(arr, l, r - 1));//對手會讓你選最小值

} int cardsinline_test (myvci arr)

if (arr.size() == 1)//只有一張牌

//1)arr[l]+s(arr,l+1,r); //先手拿左邊的牌 剩下l+1 r 後手

//2)arr[r]+ s(arr,l,r-1)//先手拿右邊的牌,剩下 l-r-1後手

return max(f(arr, 0, arr.size() - 1), s(arr, 0, arr.size() - 1));}

//範圍上嘗試

void cardsinline_main()

{ cout << "***********cardsinline_main***********" << endl;

myvci arr;

arr.push_back(1);

arr.push_back(9);

arr.push_back(1);

int re=cardsinline_test(arr);

cout<

博弈演算法的4種模板

尼姆博弈指的是這樣乙個博弈遊戲 有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能從一堆物品中取部分或全部物品,最少取一件,取到最後一件物品的人獲勝。結論就是 把每堆物品數全部異或起來,如果得到的值為0,那麼先手必敗,否則先手必勝。public static void main s...

暴力遞迴列舉演算法 之 24點遊戲

你有 4 張寫有 1 到 9 數字的牌。你需要判斷是否能通過 的運算得到 24。思想 1 第一次從列表中隨意取出兩個數,做四則運算後再放回列表,即從4個數變成3個數。2 從剩下三個數中,任取兩個數,做四則運算後放回,即從3個數變成2個數。3 將兩個數進行四則運算,如果結果是24 1e 6,則表明找到...

演算法基礎 第八章 暴力遞迴

常見的遞迴問題 幾種常見的嘗試型別 介紹遞迴和動態規劃 暴力遞迴 1,把問題轉化為規模縮小了的同類問題的子問題 2,有明確的不需要繼續進行遞迴的條件 base case 3,有當得到了子問題的結果之後的決策過程 4,不記錄每乙個子問題的解 動態規劃 1,從暴力遞迴中來 2,將每乙個子問題的解記錄下來...