題目大概意思是:在乙個亂序的數列中,找出其相加之和最大的子列。例如在[-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,...