演算法中的零和博弈

2021-10-09 08:49:45 字數 3159 閱讀 1925

零和博弈就是字面意思所表示的博弈情形,博弈雙方在博弈過程中的總價值是不變的,雙方某一方價值的增長必然會導致另一方價值的縮減,零和博弈是具有先手優勢和後手劣勢的。

先手優勢

所謂先手優勢其實指的是博弈雙方具有優先選擇權的一方,具有優先選擇的優勢,他可以優先控制選擇的走向。

後手劣勢

後手劣勢指的是博弈雙方中,後手一方在選擇時會受到先手優勢的影響,儘管博弈雙方都可以選擇最有利於自己的順序進行,但是後手是在先手制約下的最優選擇,所以後手是博弈雙方中具有劣勢的一方。

總之零和博弈作為一種常見的博弈方式我們只需要記住兩個重要點——①博弈總和不變;②博弈雙方在自己的立場上都是選擇最優的。

題目描述如下:

給定乙個表示分數的非負整數陣列。 玩家 1 從陣列任意一端拿取乙個分數,隨後玩家 2 繼續從剩餘陣列任意一端拿取分數,然後玩家 1 拿,…… 。每次乙個玩家只能拿取乙個分數,分數被拿取之後不再可取。直到沒有剩餘分數可取時遊戲結束。最終獲得分數總和最多的玩家獲勝。

給定乙個表示分數的陣列,**玩家1是否會成為贏家。你可以假設每個玩家的玩法都會使他的分數最大化。

題目分析:

分析題目我們發現,這是一道典型的零和博弈演算法題,所以按照之前所說的兩個重要點,我們可以得到以下思路:

按照博弈雙方總是在自己的立場選擇最優的解,那麼意味著假如當前陣列的左右兩端序號分別為left和right,那麼當前長度下當前做出選擇的一方應當做出最有利於自己的選擇,也即價值最大的選擇。現在當前選擇的一方可以選擇的方案有拿left或者拿right兩種選擇,他選擇其中一方的依據是使得自己的利益最大,問題是如何判斷拿取left或者right後的利益呢?我們知道的是當前選擇方選擇left或者right中乙個後,後一方在剩餘的陣列中選擇也是最有利於他的,所以假如另外一方在之後的選擇中選擇了乙個最優方案,該方案的最大利益我們也已經知曉了為s,那麼我們該如何得到當前一方最大利益呢?

這就需要用到第二個重要點,零和博弈中博弈的總價值是不變的,所以當我們知道剩餘陣列中另一方的最優價值為s,那麼當前選擇方所獲得的價值也就確定了——即剩餘陣列價值總和-s;但是由於當前方需要選擇價值最大的策略,所以他需要在選擇left或者right中做乙個權衡,所以當前選擇方的最大利益為max(選擇left的利益+去掉left後的剩餘陣列價值總和-去掉left後另一方的最優選擇,選擇right的利益+去掉right後的剩餘陣列價值總和-去掉right後另一方的最優選擇);

通過上面分析我們實際上已經可以得到演算法實現了,按照這個思路主要有兩種實現方式:

遞迴實現

class

solution

return a;

}int

dfs(vector<

int>

&nums,

int left,

int right)

return

max(nums[left]

+sum

(nums,left+

1,right)

-dfs

(nums,left+

1,right)

,nums[right]

+sum

(nums,left,right-1)

-dfs

(nums,left,right-1)

);}bool

predictthewinner

(vector<

int>

& nums)

};

時間空間複雜度:

動態規劃

class

solution

return a;

}bool

predictthewinner

(vector<

int>

& nums)

dp[j]

[j+i]

=max

(nums[j]

+sum

(nums,j+

1,j+i)

-dp[j+1]

[j+i]

,nums[j+i]

+sum

(nums,j,j+i-1)

-dp[j]

[j+i-1]

);}}

int player1=dp[0]

[nums.

size()

-1];

int player2=

sum(nums,

0,nums.

size()

-1)-player1;

return player1>=player2?

true

:false;}

};

時間空間複雜度:

記憶化搜尋

class

solution

return a;

}int

dfs(vector<

int>

&nums,

int left,

int right)

//如果之前[left+1,right]區間的值已經dfs求出了,那麼直接使用即可,這就是記憶化搜尋的過程,

//之前已經搜尋過的子結構,可以直接使用其值,避免重複操作,可以有效的降低複雜度。

if(dp[left+1]

[right]!=0

)else

}else

if(dp[left]

[right-1]

!=0)else

return dp[left]

[right];}

bool

predictthewinner

(vector<

int>

& nums)

};

時間空間複雜度:

總之來說,記憶化搜尋其實就是利用搜尋的過程確定乙個動態規劃求解子問題的拓撲序列,使得動態規劃能夠順利推導,而動態規劃則是利用我們已知的一些顯而易見的拓撲序列進行求解。

零和博弈 正和博弈和負和博弈

零和博弈 正和博弈和負和博弈 零和博弈是指雙方在博弈時,在嚴格的競爭條件下,一方獲得利益的同時必然意味著另一方遭受損失,雙方受益加和為0。負和博弈是指雙方在博弈中由於不可調節的衝突和矛盾,有損雙方的利益,導致兩敗俱傷的場面。正和博弈是指博弈雙方的利益都有所增加,雙贏局面。例子 夫妻二人要看電視,可是...

博弈論 10 零和博弈 正和博弈

零和博弈 簡單來說,你贏1元,我就會輸1元,輸贏之和為零的博弈,叫零和博弈,零和博弈只存在於封閉系統內部,且會導致你死我活的內部競爭。正和博弈 在零和博弈中加入增量,輸贏之和大於零,就會變成正和博弈。1 開啟封閉系統,尋求增量 2 確定 存量分配規則 也就是制定規則,避免內部競爭 第一,開啟封閉系統...

non zero sum game 非零和博弈

剛剛從ted。com聽到乙個 非零和博弈 的概念,有點領悟,在假期時候希望能給大家的智慧型帶來乙個搔癢作用 首先我要說明,我不是經濟學家,所以不是從經濟學角度去看這個問題。我是職業經理人,一直認為做好事先要做好人,做好人要有良好的心態,我是從心態這個角度去看 零和博弈 相信很多人都聽過 零和博弈 這...