最大子串行求解及分治演算法的一些例子

2021-07-27 23:44:30 字數 939 閱讀 1558

題目大概意思是:在乙個亂序的數列中,找出其相加之和最大的子列。例如在[-2,1,-3,4,-1,2,1,-5,4]子列為[4,-1,2,1]有最大和為6。

我的解題思路就是做乙個歷遍,首先從數列第一位與後面的各個位相加,一直加到末尾,找出第一位數中最大和子列的最後一位數;然後再從第二位數往後加起來,以此類推。找到陣列中的某一位數相加到它之後的某位數為最大。

#include using namespace std;

int maxsub(const int *a,int n,int *start,int *end)

} }return max_sum;

} int main()

int max = maxsub(a,n,&start_index,&end_index);

cout<<"contiguous subarray"<<"[";

for(int i=start_index;i

採用的是「分治「(divide-and-conquer)策略。思想是把問題分成兩個大致相當的子問題,然後遞迴地對他們求解,這是」分「。」治「階段將兩個子問題的解合併到一起,可能再做一些附加的工作,最終得到整個問題的解。

演算法複雜度為o(n)的演算法

如果a[i]為負數,那麼它不可能代表最優序列的起點,因為任何包含a[i]的作為起點的子串行都可以通過

用a[i+1]作為起點而得到改進。同理,任何小於零的子串行不可能是最優子串行的字首。

int maxsubseqsum3(const int *a, int n, int *start, int *end)

else if(cur_sum < 0)

if(j <= *end)

*start = j;

} return max_sum;

}

其實看了之後還是不太懂— —||,怎麼分,怎麼治?求解答

分治演算法 連續最大子串行和問題

最大連續子串行和問題 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個。這個問題的求解思路有很多,可以暴力求解時間複雜度o n3 也可以使用動態規劃求解時間複雜度o n 下面的 是採用的分治遞迴求解的時間複雜度o nlogn def ...

最大子串行和問題的求解

問題描述 給定 可能存在負值 整數a1,a 2.a n,求最大子串行和。如果所有的整數均為負數,則最大子串行和為0.列如 對於輸入 2,11,4,13,5,2,該輸入的最大子串行和為20 11 4 13 現在我們將敘述四個演算法來求解最大子串行和問題。1.該演算法是使用窮舉法來嘗試所有的可能 演算法...

最大子串行和問題的求解

怎麼求出乙個陣列最大的連續累加之和呢?方法有很多,我們目前只講乙個比較不錯的方法,該方法使用了分治遞迴的思想。我們假設下面是我們需要計算的陣列,其中a是游標,我可以知道游標將陣列分成了兩段,最大值有可能出現在前半段也有可能出現在後半段,還有一種情況是跨越a 中間 相加的一段。1,3,5,7 a,9,...