最大連續子陣列和

2021-07-10 23:55:38 字數 1356 閱讀 5455

給定乙個整數陣列,元素的值有正有負。定義「連續子陣列和」為連續幾個陣列的元素的和,求最大的連續子陣列和。已知這個值在int能夠表示的範圍內。

無腦暴力做就是列舉所有的子陣列,o(n^2),然後對於每個子陣列求和,自然就找出最大的了,複雜度總共是o(n^3)。

能否優化?想想**做了重複多餘的事情了?

沒錯,就是對每個子陣列求和的時候,先做一下字首和+字尾和的預處理,就可以將子陣列求和的複雜度將為o(1)了,總的複雜度為o(n^2)。

具體實現**如下:

int maxsubarraysum(const

vector

& v)

return maxsum;

}

還有更快更好的方法嗎?

其實這是一道很簡單的dp問題,有o(n)的做法的。

定義dp[i]為以第i位元素結尾的所有子陣列中的和最大的那個和的值,那麼轉移方程很顯然是:

dp[i] = max(dp[i-1] + x[i], x[i])

它的意思是,我自己這一位(即第i位)要和前面的湊到一起成為一組呢,還是我自己乙個人一組呢?看誰大咯~寫起來就幾行而已:

int maxsubarraysum2(const

vector

& v)

return maxsum;

}

笨方法不一定是容易的,就像b和c的對比一樣,2333,多接觸一些好玩的演算法,既可以豐富知識,也可以靈活自己的頭腦,何樂不為?

最後附上自己此次的測試**:

#include 

#include

#include

#include

#include

using

namespace

std;

vector

gen(int size)

return v;

}void display(const

vector

& v)

// 暴力+前字尾和優化

int maxsubarraysum(const

vector

& v)

return maxsum;

}// 動態規劃求解

int maxsubarraysum2(const

vector

& v)

return maxsum;

}int main()

printf("pass test case %d\n", i+1);

}return

0;}

最大連續子陣列和

題目描述 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值,要求時間複雜度為o n 例如輸入的陣列為 1,2,3,10,4,7,2,5 和最大的子陣列為 3,10,4,7,2 因此輸出為該子陣列的和18。思路 採用貪婪法...

最大連續子陣列和

輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值,要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。第乙個想法肯定就是如果能夠把陣...

最大連續子陣列和

問題是這樣的 乙個整數陣列中的元素有正有負,在該陣列中找出乙個連續子陣列,要求該連續子陣列中各元素的和最大,這個連續子陣列便被稱作最大連續子陣列。比如陣列的最大連續子陣列為,最大連續子陣列的和為5 2 1 2 8。下面按照時間複雜度逐步優化的順序依次給出這三種演算法。該方法的思想非常簡單,先找出從第...