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

2021-07-11 11:38:51 字數 966 閱讀 1326

這篇文章是在自學演算法導論練習的

直接入正題:

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

原理:一串陣列可以對半分,一串陣列的最大連續子串行可能是在左端,右端以及跨越中間

依次遞迴分解求得最小塊的最大值,再向上組合成整段最大連續子串行

#include#includeusing namespace std;

int max(int a,int b,int c)//尋找三者最大

int maxcross(int *data,int left,int right)//尋找過中間元素的最大

maxleft=-100000;//尋找mid左邊最大

sum=0;

for(k=mid;k>=left;k--)//注意必須是從mid--

maxright=-100000;//尋找mid右邊最大

sum=0;

for(k=mid+1;k<=right;k++)

return maxleft+maxright;//返回最大和

}int findmax(int *data,int left,int right)

{ int maxleft,maxright,maxcross,mid,maxlist;

mid=(left+right)/2;

//左中右順序可以任意

maxcross=maxcross(data,left,right);//尋找過中最大

//尋找左邊最大

if(mid>left) //如果只有乙個元素直接返回

maxleft=findmax(data,left,mid);

else

maxleft=data[left];

//尋找右邊最大

if(mid+1>n;

data=new int [n];

cout<<"請輸入序列:";

for(k=0;k>data[k];

cout<

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

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

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

俺是菜鳥了解一下,這是我在演算法學習中的一些想法,如果有寫的不好的還請諒解,歡迎學習交流 3 問題 有長度為n的整數序列,求一段連續的子串行,要求該子串行的和為最大,並求出最大值。用分治法解決最大子串行和問題使用的是遞迴,它的思想是 1.將乙個長度為n的序列,一分為二變為兩個長度為n 2的子串行,繼...

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

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