最大子串行,一開始我是用比較方便的向量的:
#include #include #include #includeusing namespace std;
vectorf_m_c_s(vector&a,int low,int mid,int high)}
int right_sum=int_min;
sum=0;
int max_right;
for(int j=mid;j!=high;++j)}
return vector;}
vectorf_m_s(vectora,int low,int high);}
else
else if(right_sum>=left_sum && right_sum>=cross_sum)
else }}
但是格式十分麻煩,看了網上的答案之後,發現可以定義乙個類,專門用來儲存三個數字。
實現:
typedef struct ma;
這樣把上面的分治方法再寫一次:
ma f_m_c_s_ma(int a, unsigned low, unsigned mid, unsigned high)}
int right_sum=int_min;
sum=0;
for(int j=mid;j!=high;++j)}
result.sum=left_sum+right_sum;
return result;}
ma f_m_s_ma(int a,unsigned low,unsigned high);
return result;}
else
else if(right.sum>=left.sum && right.sum>=cross.sum)
else }}
理論上是沒有錯的
最大子串行和(分治求法)
這已經是一道家喻戶曉的題了,給出乙個陣列,裡面是一串數字,求出子串行中和最大的,輸出這個和。思路 這道題有很多經典解法,其中最典型應該是動態規劃,而我們今天要討論的是用二分法怎麼求解這道題。include using namespace std int aleng int f int a,int b...
最大子串行和以及最大矩陣和
做題的時候遇到了乙個最大矩陣和,搜了一下是從最大子串行和演變而來的,所以先做一下最大子串行和。這個有乙個需要注意的事情是,如果矩陣裡面所有的元素都是負值,可以返回0,也可以返回最大負數,看具體題目要求 對陣列來說,乙個最大的子串行可以通過遍歷從每乙個位置開始的序列中得到,所以我們遍歷如a1,a2,a...
分治演算法 連續最大子串行和問題
最大連續子串行和問題 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個。這個問題的求解思路有很多,可以暴力求解時間複雜度o n3 也可以使用動態規劃求解時間複雜度o n 下面的 是採用的分治遞迴求解的時間複雜度o nlogn def ...