最大子列和問題

2021-10-19 12:58:54 字數 2868 閱讀 9459

在電腦科學中,最大子數列問題的目標是在數列的一維方向找到乙個連續的子數列,使該子數列的和最大。舉乙個最簡單的例子,給出陣列求解它的最大子列和。常規思路逐一尋找,具體步驟如下:

①尋找長度為1的子列:,,,。數列和分別為:-4,2,-1,5

②尋找長度為2的子列:,,。數列和分別為:-2,1,4

③尋找長度為3的子列:,。數列和分別為:-3,6

④尋找長度為4的子列:。數列和分別為:2

所以所給陣列的最大子列和為:6。

分支法的大致思想就是將大的問題分解成小的子問題,最後將子問題歸納最終得出最終解,時間複雜度為o(nlogn)。上述例子中,所給出的陣列含有4個元素,按照分治思想,將分解為和兩個子陣列,繼續分解為,,,四個陣列分別求解。分解部分完成以後就需要按照要求最分解後的子陣列進行合併。

。以中間軸(紅色逗號)為分界向兩邊找4個部分的子列和,得到4個最佳子列(下劃線)。它們的最大子列和為5。

①中1,2部分合併,3,4部分合併,需要注意的是合併後保證以中間軸(紅色逗號)為中心能取到最佳子列,最大子列和為4。

對②中的部分再次進行合併,得到最大子列和為6。

///返回三個整數中的最大值

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

///分治法求list[left]到list[right]的最大子列和

int divideandconquer(int list,int left,int right)else

}///分的過程:找到中分點

int center=(left+right)/2;

///遞迴求兩邊子列的最大和

maxleftsum=divideandconquer(list,left,center);

maxrightsum=divideandconquer(list,center+1,right);

///求跨越分界的最大子列和

maxleftbordersum=0;

leftbordersum=0;

///從中間向左掃瞄

for(int i=center;i>=left;i--)

}///從中間向右邊掃瞄

maxrightbordersum=0;

rightbordersum=0;

for(int i=center+1;i<=right;i++)

}///返回治的結果

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

}///函式呼叫介面

int maxsubseqsum3(int list,int n)

設定thissum用於累加記錄子列和,maxsum記錄當前最大子列和。初始化thissum=0,maxsum=0

①thissum累加第1個元素,thissum=-4,小於零可以觀察到,陣列中存在大於零的元素,在這裡thissum<0,thissum中加了負數會使子列和減小。顯然不可能為最大子列和,此時無需更新maxsum,且將thissum置0。

②thissum累加第2個元素,thissum=2,thissum>maxsun=m,更新maxsum=2。

③thissum累加第3個元素,thissum=thissum+(-1)=1,此時,thissum>0且thissum④thissum累加第4各元素,thissum=thissum+5=6,此時,thissum>maxsum,更新maxsum=6。至此,陣列元素全部訪問結束,最終得到最大子列和為6。

int maxsubseqsum4(int list,int n)else if(thissum<0)

}return maxsum;

}

#includeusing namespace std;

///返回三個整數中的最大值

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

///分治法求list[left]到list[right]的最大子列和

int divideandconquer(int list,int left,int right)else

}///分的過程:找到中分點

int center=(left+right)/2;

///遞迴求兩邊子列的最大和

maxleftsum=divideandconquer(list,left,center);

maxrightsum=divideandconquer(list,center+1,right);

///求跨越分界的最大子列和

maxleftbordersum=0;

leftbordersum=0;

///從中間向左掃瞄

for(int i=center;i>=left;i--)

}///從中間向右邊掃瞄

maxrightbordersum=0;

rightbordersum=0;

for(int i=center+1;i<=right;i++)

}///返回治的結果

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

}///函式呼叫介面

int maxsubseqsum3(int list,int n)

int maxsubseqsum4(int list,int n)else if(thissum<0)

}return maxsum;

}int main();

cout<<"分治法:"

}

最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...

最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...

最大子列和問題

給出乙個序列,求出最大子列和。演算法一 long maxsum int a,int n return maxsum 這是乙個窮舉的演算法,有三個巢狀的for迴圈,時間複雜度為o n 3 在計算的時候有很多不必要的重複項,例如當i 0,j 3時,和的計算為 a 1 a 2 a 3 當i 0,j 4時,...