1. 程式人生 > >最大序列和 C++

最大序列和 C++

描述

題目描述
給出一個整數序列S,其中有N個數,定義其中一個非空連續子序列T中所有數的和為T的“序列和”。 對於S的所有非空連續子序列T,求最大的序列和。 變數條件:N為正整數,N≤1000000,結果序列和在範圍(-2^63,2^63-1)以內。
輸入描述:
第一行為一個正整數N,第二行為N個整數,表示序列中的數。
輸出描述:
輸入可能包括多組資料,對於每一組輸入資料,
僅輸出一個數,表示最大序列和。
示例1
輸入

5
1 5 -3 2 4
6
1 -2 3 4 -10 6
4
-3 -1 -2 -5

輸出

9
7
-1

分析

最長公共子序列的問題,可以用O(n)的時間內完成,也可以用分治法nlgn
O(N)方法的思想在於,一段公共子序列的結尾必然是0-n-1之間的某個位置,那麼當前這個位置是作為新序列的開始,還是在之前的序列上新增,可以這樣想,若是到位置m時的子序列和<0,那這個位置的數作為新開始的序列必然比前面那段負的加上自己的和要大,所以此時的最大隻為當前位置的數;若前面的和是正的,那加上自己必然比自己本身要大。
然後在這個過程中不斷更新最大的maxsum

程式碼

#include<cstdio>
#include<iostream>
using namespace std
; int main() { int n; while(cin>>n) { long long maxsum =-1, maxhere = -1; long long x ; for(int i = 0;i<n;i++) { cin>>x; if(maxhere<=0){ maxhere = x; } else{ maxhere += x; } if
(maxhere>maxsum) maxsum = maxhere; } cout<<maxsum<<"\n"; } }