常見的做法有:列舉區間、動態規劃等。
昨天突然想到了乙個o(n)的演算法,拿來分享給諸位
我們從後向前看這串數字 5 6 -2 3 -5 發現倒數第一位就是負數(-5),毫無疑問,這個負數肯定不在我的最大子串和裡,因為我們捨去它並不會影響我們鏈結其它有價值的數,所以我們將它拋棄。
繼續考察,這時我們遇到了3,我們考慮加不加入3。可能該有同學問了,3是正數,為啥子不直接加它還需要考慮?
因為我們想加入3就得加入鏈結它的數,鏈結它的數是負數(-2),所以肯定要考慮加入它值不值當,經過考察,我們發現即使加入了3和-2,它們總的來說還是有貢獻的(1)那麼我們就可以將它加入。
就像這樣,我們每遇到乙個元素都要考察加入它是否值當,也就是說,它與和它鏈結的子串和,如果是負數,我們將它捨去,如果是正數(代表有貢獻)我們就可以將它加入到最大子串和裡。
同時我們需要乙個變數來記錄最大子串和。
比如序列變成了 -5,-6,-2,3,-5 我們先捨去-5,考察到3的時候就已經得出來了最大子串,因此記錄。
**:
int sum = 0;
int max = 0;
for(int i=n-1; i>=0; i--)
if( sum > max)
max = sum;
}
記錄這個區間的起始位置和終點位置也很簡單,在max獲得最大值的時候記錄一下下標。然後從這個下標開始,sum和max清零,向後遍歷,max獲得最大值的時候再記錄一邊下標
#includeusing namespace std;
int main()
if( sum > max)
}cout}
cout<<"起點:"
}
nyoj 44 子串和(子串和最大問題)
記憶體限制 64mb 時間限制 5000ms special judge no accepted 12 submit 48 給定一整型數列,找出連續非空子串,使得該子串行的和最大,其中,1 x y n。第一行是乙個整數n n 10 表示測試資料的組數 每組測試資料的第一行是乙個整數n表示序列中共有n...
NYOJ 44 最大連續子串行和
時間限制 5000 ms 記憶體限制 65535 kb 難度 3 描述給定一整型數列,找出連續非空子串,使得該子串行的和最大,其中,1 x y n。輸入第一行是乙個整數n n 10 表示測試資料的組數 每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的一行裡有n個整數i 100 輸出 對...
計蒜客 最大子陣列 NYOJ題目44 子串和
在乙個陣列中找出和最大的連續幾個數。至少包含乙個數 例如 陣列a 2,1,3,4,1,2,1,5,4 則連續的子串行 4,1,2,1 有最大的和6.輸入格式 第一行輸入乙個不超過1000的整數n。第二行輸入n個整數a i 輸出格式 第一行輸出乙個整數,表示最大的和。樣例輸入3 1 1 2 樣例輸出2...