最大子列和求解

2021-09-29 14:17:12 字數 1810 閱讀 2791

題目如下:

四種解題思路對應的完整**如下:

//最大子列和求解思路

#include#includeusing namespace std;

int maxsubseqsum1(int nums,int size);

int maxsubseqsum2(int nums,int size);

int maxsubseqsum3(int nums,int size);

int maxsubseqsum4(int nums,int size);

void begin();

int main()

exit(1);

}void begin()

int nums[size];

for(i=0;i>nums[i];

}maxsum = maxsubseqsum1(nums,size);

cout

return sum;

}//基於思路一進行改進,每次右邊界右移乙個單位時,不再重新開始累加求和,直接在之前的基礎上累加,也就是同乙個左邊界i,對於右邊界j右移時,計算一次加法運算即可

//時間複雜度t(n)=o(n^2)

int maxsubseqsum2(int nums,int size) }}

return sum;

}//返回3個整數中的最大的乙個

int getmaxint3(int a,int b,int c)

//遞迴呼叫分治思想的核心**

int dividegovern(int nums,int left,int right)

//先分

center = ( left + right ) / 2;

//遞迴呼叫獲取左邊最大子列和 left.....center

maxleftsum = dividegovern( nums, left, center );

//遞迴呼叫獲取右邊最大子列和 center+1.....right

maxrightsum = dividegovern( nums, center+1, right );

//跨邊界最大子列和

maxleftbordersum = 0;

leftbordersum = 0;

for( i=center; i>=left; i-- ) /* 左邊掃瞄結束 */

maxrightbordersum = 0;

rightbordersum = 0;

for( i=center+1; i<=right; i++ ) /* 右邊掃瞄結束 */

/* 下面返回"治"的結果 */

return getmaxint3( maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum );

}//思路三,分而治之,先分後治,採用遞迴的思想

//時間複雜度為t(n)=o(nlogn)

int maxsubseqsum3(int nums,int size)

//時間複雜度t(n) =o(n)

int maxsubseqsum4(int nums,int size)

if(thissum<0)

}

return sum;

}

最大子列和

int maxsubsequencesum const int a,int n if thissum maxsum 如果新的子列和更大,則更新子列和 maxsum thissum return maxsum 時間複雜度o n3 int maxsubsequencesum const int a,in...

最大子列和

給出乙個長度為 n 的序列 a,選出其中連續且非空的一段使得這段和最大。第一行是乙個整數,表示序列的長度 n。第二行有 n 個整數,第 i個整數表示序列的第 i個數字 a i 輸出一行乙個整數表示答案。輸入7 2 4 3 1 2 4 3 輸出資料範圍 對於 40 的資料,保證 n leq 2 tim...

最大子列和

最大連續子串行和問題 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大連續子串行和即為20。注 為方便起見,如果所有整數均為負數,則最大子串行和為0。解決這樣乙個問題是乙個很有趣的過程,我們可以...