連續最大子串行的幾種解法

2021-06-19 11:53:51 字數 1801 閱讀 8569

所謂最大連續子串行,就是求出給定一串數字中連續的那一段元素和的最大值。

舉例如:

給定序列:2 3 -1 4 7  則最大子串行的值應為4+7=11.

先說第一種方法:暴力列舉陣列中的元素,不斷求和,進行更新即可。可是時間複雜度上一般承受不了。o(n^3)的時間複雜度確實對一般的問題很難接受。

第二種:把a[0]初始化為max值,則列舉n個位置,每次把sum置為0,然後從位置i開始計算從i開始的最大連續子串行和的大小,如果大於max,則更新max。

部分**如下:

inline int maxsequence(int arr, int len)

}return max;

}

第三種:分治法。原序列可以分為兩部分,不斷遞迴計算出這兩塊序列的和,然後從中間向兩端遍歷,找到最大的序列的和。

部分**如下:

/*求三個數最大值*/

inline int max3(int i, int j, int k)

inline int maxsequence2(int a, int l, int u)

/*求橫跨左右的最大連續子串行右半部分*/

int rmax=a[m+1], rsum = 0;

for (int i=m+1; i<=u; i++)

return max3(lmax+rmax, maxsequence2(a, l, m), maxsequence2(a, m+1, u)); //返回三者最大值

}

第四種:讀入的時候預處理出乙個字首和陣列,即sum[i]表示a[o]+a[1]+a[2]+.....+a[i-1];

然後又是列舉了,但實際這個複雜度也偏高,效率不太理想。

第五種:dp,最簡單的dp吧,這個不知道dp的人也可以很容易寫出來,用dp[i]表示以a[i]結尾所獲得的最大值,那麼顯然有:dp[i]=max(dp[i-1]+a[i],a[i]);不斷更新這個dp陣列即可,時間複雜度最優,o(n)。

另外值得一提的是,還有一種變形的最大連續子串行的問題,簡單的如這個題的b題

最常見的也是稍微有點麻煩的就是求最大子矩陣的問題,以前一直不會算,最後稍微想下就明白了。給出的是二維陣列,但是求的值相當於還是應用的最大連續子串行的思想。具體做法就是把矩陣轉換為一維的來算。

也就是列舉矩陣的連續幾行的合併,這樣就轉換為一維的了,再用最大子串行的演算法去求,更新最大值就可以了

下面附上幾種求連續最大子串行的**:

#include #include #include int dp[501][501];

using namespace std;

inline int maxsequence(int arr, int len)

}return max;

}/*求三個數最大值*/

inline int max3(int i, int j, int k)

inline int maxsequence2(int a, int l, int u)

/*求橫跨左右的最大連續子串行右半部分*/

int rmax=a[m+1], rsum = 0;

for (int i=m+1; i<=u; i++)

return max3(lmax+rmax, maxsequence2(a, l, m), maxsequence2(a, m+1, u)); //返回三者最大值

}int maxsequence3(int a, int len)

}return maxsum;

}int main()

cout<

連續最大子串行和的幾種演算法

題目 連續子串行最大和,其實就是求乙個序列中連續的子串行中元素和最大的那個。比如例如給定序列 其最大連續子串行為,最大和為20 思路 1 暴力解決o n 2 從0開始遍歷,用max儲存最大子串和 public int maxsubarray1 int nums return max 思路2 動態規劃...

最大子串行和 連續

最大子串行和 連續 include using namespace std int maxsum int a,int n return sum int main 測試全是負數的用例 cout 4 cout 8 pause return 0 比如陣列 1,2,3,10,4,7,2,5 最大子串行和為1...

最大子串行和 連續or不連續

coding utf 8 created on sun oct 14 21 10 28 2018 author dell 功能 最大子串行問題 def test func num list 求陣列中最大子串行的和,子串行可以不連續 也可以寫成if判斷語句只累加整數即可 n len num list ...