使用分治法解最大連續子串行和問題

2021-08-17 03:22:08 字數 1501 閱讀 7475

俺是菜鳥了解一下,這是我在演算法學習中的一些想法,如果有寫的不好的還請諒解,歡迎學習交流_(:3」∠)_

問題:有長度為n的整數序列,求一段連續的子串行,要求該子串行的和為最大,並求出最大值。

用分治法解決最大子串行和問題使用的是遞迴,它的思想是:

1.將乙個長度為n的序列,一分為二變為兩個長度為n/2的子串行,繼續將子串行們一分為二,直到每個子串行只含有1個整數。

2.此時問題已經足夠小,「最大子串行和」有以下三種情況:左邊序列的最大子串行和、右邊序列的最大子串行和和處在中間位置上的最大子串行和,我們通過比較,得到三者中的最大值。

3.再將這些「小問題」合併,使用同樣的比較方法逐步向上合併這些「左右序列」,直到得到整個序列的最大子串行和,解決問題。

在這個問題中,分為兩種情況:1.序列含有正整數;2.序列不含正整數。我的想法是可以對這兩種情況分別使用對應的函式。

第一種情況,序列含有正整數,演算法的時間複雜度為o(nlog(n)):

int maxsubseqsum(int a,int left,int right)

maxrightbordersum=0;

rightbordersum=0;

for(i=mid+1;i<=right;i++) //從中間位置向右找靠邊界的最大子串行

maxmidsum=maxleftbordersum+maxrightbordersum; //得到處在中間位置上的最大子串行和

return max3(maxleftsum,maxrightsum,maxmidsum);

}

第二種情況,序列不含正整數,可以改為使用分治法取序列中最大的數,演算法的時間複雜度為o(log(n)):

int maxnum(int a,int left,int right)

完整執行**:

#include#define maxsize 100

int max3(int a,int b,int c)

int maxsubseqsum(int a,int left,int right)

maxrightbordersum=0;

rightbordersum=0;

for(i=mid+1;i<=right;i++) //從中間位置向右找靠邊界的最大子串行

maxmidsum=maxleftbordersum+maxrightbordersum; //得到處在中間位置上的最大子串行和

return max3(maxleftsum,maxrightsum,maxmidsum);

}int maxnum(int a,int left,int right)

void main()

{ int a[maxsize];

int count=0;

int i,n;

printf("序列長度:");

scanf("%d",&n);

printf("輸入整數序列:");

for(i=0;i

分治法解最大連續公共子串行

這篇文章是在自學演算法導論練習的 直接入正題 最大連續子串行 分治法 原理 一串陣列可以對半分,一串陣列的最大連續子串行可能是在左端,右端以及跨越中間 依次遞迴分解求得最小塊的最大值,再向上組合成整段最大連續子串行 include includeusing namespace std int max...

最大連續子串行和(分治法)

給n個數,要求n個數的最大連續子串行和。dp在o n 的時間內就能求出,很簡單。但這裡用分治的思想去做,複雜度是o nlogn 二分用了o logn 每次二分內的處理用了o n 將乙個序列對半切 mid 那麼這個最大連續子串行和要麼在 l,mid 要麼在 mid 1,r 要麼跨越兩邊。那麼就要求出 ...

求最大連續子串行和 分治法實現

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。tips 這裡的時間複雜度為o nlogn 本題的思路是二分查詢法中學到的分治法,明確一點,...