題目:有乙個整型陣列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,將每乙個子問題的解記錄下來...