此演算法的核心是把數列分為left和right兩部分
其中left[i]表示從數列第1個位置到第i個位置的最大和
right[j]表示第j個位置到第n個位置的最大和
兩者加起來即為所求
----------------dp演算法
#include
#include//為了使用max函式
using namespace std;
int main()
//------------求解left[i]
left[0]=a[0];
for(int i=1;i
//---------------求解right[j]
right[n-1]=a[n-1];
for(int j=n-2;j>=0;j--)
//此時right[j]還沒整理完成
for(int j=n-2;j>=0;j--)
right[j]=max(right[j+1],right[j]);
int r=-1000;
for(int i=1;i
以數列 -10 15 -2 10 14為例子
left[0]=a[0];
for(int i=1;i
經過這段操作之後left[i]為
left[0]=-10
left[1]=15
left[2]=13
left[3]=23
left[4]=37
再經過for(int i=1;i
left[0]=-10
left[1]=15
left[2]=15
left[3]=23
left[4]=37
同理right最終處理結果為
right[0]=37
right[1]=37
right[2]=24
right[3]=24
right[4]=14
最後的步驟是把每個left[i]和right[i+1]相加比較得出最大值
left[0]+right[1]=27
left[1]+right[2]=39
left[2]+right[3]=39
left[3]+right[4]=37
所以就得出了39啦。。
求兩個子陣列最大的累加和
來自牛客網左程雲演算法第二堂課第一題 問題 給定乙個陣列,其中當然有很多的子陣列,在所有兩個子陣列的組合中,找到相加和最大的一組,要求兩個子陣列無重合的部分。最後返回累加和。要求 時間複雜度達到 o n 解法 我們很容易想到將整個陣列分成兩個部分,然後分別求這兩個部分子陣列的最大累加和。將結果累加起...
求兩個子陣列最大的累加和
最近在學習演算法,發現左神左程雲講的是真的好,相見恨晚,推薦大家去學習。題目 給定乙個陣列,其中當然有很多的子陣列,在所有兩個子陣列的組合中,找到相 加和最大的一組,要求兩個子陣列無重合的部分。最後返回累加和。要求 時間複雜度達到 o n 這道題要想做的順利,首先我們先需要知道乙個演算法原型,也就是...
兩個子串行的最大點積
給你兩個陣列nums1和nums2。請你返回nums1和nums2中兩個長度相同的非空子串行的最大點積。陣列的非空子序列是通過刪除原陣列中某些元素 可能乙個也不刪除 後剩餘數字組成的序列,但不能改變量字間相對順序。比方說,2,3,5 是 1,2,3,4,5 的乙個子串行而 1,5,3 不是。示例 1...