A和B取數,動態規劃

2021-10-03 06:37:38 字數 1054 閱讀 3978

有一排正數,玩家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中的乙個,…

思路:動態規劃,設定兩個狀態,

分別為f(i,j)和 s(i,j)分別表示在 序列i..j 之間,先手能得到的最大數目以及後手計算後剩下的最大數目。

所以先手f(i,j) = max(arr[i]+s(i+1,j),arr[j]+s(i,j-1)) 表示目的為求最大的情況

後手剩下的為  s(i,j)= min(f(i+1,j),f(i,j-1);  而後手玩家為了拿到更多,所以他會選擇,留給對方最少的那種情況。

通過這種相互依賴,我們可以寫出遞迴函式,並設定遞迴邊界,

在先手情況下f(i,j),如果 i==j 表示只剩下最後乙個,那麼 就直接返回這個數。

在後手情況下s(i,j),如果 i==j 表示只剩下最後乙個,那麼 就直接返回0。因為後手玩家已經取完了,所以留給先手玩家的就為0;

接著,通過畫出依賴關係,我們可以發現f和s的相互關係,並且很多情況的遞迴都是重複計算的,所以這裡就出現了無後效性的情況,即後面的計算都不會改變之前已經計算好的。就可以根據這個寫出動態規劃。

**:

#include#includeusing namespace std;

int arr[1000] = ;

int n;

//設定兩個狀態圖

int dps[1000][1000]=;

int dpf[1000][1000]=;

int main() }

printf("%d\n",dpf[0][n-1]);

return 0;

}

動態規劃 方格取數

問題描述 設有 n times nn n 的方格圖 n le 9 n 9 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字 00。如下圖所示 見樣例 a0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 2...

動態規劃 RQNOJ 方格取數

設有n n的方格圖 n 10,我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。如下圖所示 見樣例 某人從圖的左上角的a 點出發,可以向下行走,也可以向右走,直到到達右下角的b點。在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從a點到b 點共走兩次,試找出2條這樣的...

棋盤型動態規劃 方格取數

題意 有n n的方格圖 n 10,我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。如下圖所示 見樣例 某人從圖的左上角的a 點出發,可以向下行走,也可以向右走,直到到達右下角的b點。在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從a點到b 點共走兩次,試找出2條這...