c 求解數列最大的兩個子段和

2021-06-27 03:56:46 字數 1145 閱讀 7181

此演算法的核心是把數列分為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...