筆試刷題 動態規劃 博弈問題

2021-10-04 05:58:22 字數 1335 閱讀 6628

#! /usr/bin/env python

# -*-coding:utf-8-*-

"""author: chilewang

created at 2020/03/20 15:59

question:

問題:有一排正數,代表數值不同的紙牌排成一條線,玩家a和玩家b都可以看到。

每位玩家在拿走數字的時候,都只能從最左和最右的數中選擇乙個。

玩家a先拿,玩家b再拿,兩人交替拿走所有的數字,

兩人都力爭自己拿到的數的總和比對方多。請返回最後獲勝者的分數。

例如:5,2,3,4

玩家a先拿,當前他只能拿走5或者4。

如果玩家a拿走5,那麼剩下2,3,4。輪到玩家b,此時玩家b可以選擇2或4中的乙個,…

如果玩家a拿走4,那麼剩下5,2,3。輪到玩家b,此時玩家b可以選擇5或3中的乙個,…

solution:

動態規劃

"""def card():

"""動態規劃之博弈問題

核心:斜著計算二維陣列

詳細解析:

:return:

"""arr = [1, 2, 100, 4]

arr = [3, 9, 1, 2]

first = [[0] * len(arr) for _ in range(len(arr))]

end = [[0] * len(arr) for _ in range(len(arr))]

for i in range(len(arr)):

first[i][i] = arr[i]

for i in range(1, len(arr)):

for j in range(len(arr)):

if i + j < len(arr):

first[j][j + i] = max(arr[j] + end[j+1][j + i], arr[j + i] + end[j][j + i - 1])

end[j][j + i] = min(first[j + 1][j + i], first[j][j + i - 1])

print(max(first[0][len(arr) - 1], end[0][len(arr)-1]))

for s in first:

print(s)

print('-------')

for s in end:

print(s)

return max(first[0][len(arr) - 1], end[0][len(arr)-1])

if __name__ == '__main__':

card()

刷題 動態規劃

動態規劃法 動態規劃求解問題的四個特徵 求乙個問題的最優解 整體的問題的最優解是依賴於各個子問題的最優解 小問題之間還有相互重疊的更小的子問題 從上往下分析問題,從下往上求解問題 題目 給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k ...

動態規劃題(阿里筆試)

有個窮困的藝術家。他畫了一幅超現實主義的作品 方塊手拉手 現在他已經把圖畫中手拉手的一排大小不一的方塊都畫出來了。現在要考慮上顏色了。可惜他手中的錢並不多了。但是他是個有追求的人,他希望這幅畫中每兩個相鄰的方塊的顏色是不一樣的。你能幫他計算一下把這幅畫上色後,最少需要花多少錢麼。輸入 n個方塊,k個...

動態規劃刷題總結

資料結構與演算法 41 動態規劃理論 最優子結構 無後效性和重複子問題 zj csdn部落格 乙個模型 多階段決策最優解模型,重點在於多階段,每個階段都對應著不同的狀態 三個特徵 最優子結構,無後效性,重複子問題。主要抓住最優子結構這一特徵,理解為後面的階段狀態可以由前面的階段狀態推導而來。狀態定義...