乙個整數陣列,兩個人一次分別從左邊或者右邊拿走乙個數,兩個人足夠聰明,求第乙個人拿到數的最大和。
可以提交**的題目鏈結
首先想到的是貪心法,每次都取兩端中的最大的數,但是很顯然這是錯的。例如以下的測試用例:
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 不是從零開始的。你可以假設每個輸入只對應唯一的答案,而且你不可以重複使...