陣列兩端取數之和最大

2022-06-05 02:57:12 字數 962 閱讀 8579

乙個整數陣列,兩個人一次分別從左邊或者右邊拿走乙個數,兩個人足夠聰明,求第乙個人拿到數的最大和。

可以提交**的題目鏈結

首先想到的是貪心法,每次都取兩端中的最大的數,但是很顯然這是錯的。例如以下的測試用例:

2 6 8 3
貪心法會得到結果9但是正確答案應該是10。而貪心法沒法解決全域性最優的時候,我們一般就會採用動態規劃來解決。

動態規劃最重要的就是狀態的表示和狀態轉移方程,那麼根據陣列的特點我們比較容易想到使用dp[i][j]來表示陣列下標為i到j(i<=j)的元素做遊戲得到的最優解。而如果dp[i][j]代表了a選手在i到j元素上的最優解,那麼a選手下一步要麼取走i元素,要麼取走j元素。

由於b選手也是每次選擇最優的解,那麼dp[i+1][j]或者dp[i][j-1]就代表了選手b在i到j元素上的最優解(因為a取了乙個數之後剩下的元素要麼是i+1到j,要麼是i到j-1)。

再考慮到i到j的陣列之和是固定的,那麼a的得分加上b的得分就等於i到j的元素之和,a的得分就等於這個固定值減去b的得分,因此a要想得分最高,就等價於使得b的得分最低。

因此狀態轉移方程如下:

// sum(i,j)表示下標為i到j的元素之和

dp[i][j] = sum(i,j) - min(dp[i-1][j], dp[i][j-1]);

有了狀態轉移方程,就不難寫出程式了。

#include using namespace std;

int main()

// res[i][j]表示i到j的元素之和

int res[n][n];

for(int i=0;i}

// 陣列從小到大開始dp

for(int d=1;d}

cout

}

leetcode python陣列 兩數之和

v1.0 def twosum nums,target lens len nums for i in range lens for j in range i 1,lens if nums i nums j target return i,j遍歷可通過時間過長 v2.0 def twosum nums...

陣列找指定兩數之和

include includeint main int sum 8 int number sizeof a sizeof a 0 for int i 0 i時間複雜第是o n 2 這樣的 是遠遠不能打動面試官 更好的辦法 先將整型陣列排序,排序之後定義兩個指標left和right。left指向已排序...

有序陣列 兩數之和

給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。說明 返回的下標值 index1 和 index2 不是從零開始的。你可以假設每個輸入只對應唯一的答案,而且你不可以重複使...