有一排正數,玩家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條這...