1. 程式人生 > >最大子段和

最大子段和

重新開始 最大子段和 fine 最大 pac urn 個數字 scanf print

題意:給出一段序列,選出其中連續且非空的一段使得這段和最大。

O(N^2)做法:

O(n)求出前綴和,O(N^2)枚舉每個區間即可。

代碼就不給了。

O(N)做法:

每一個數字,它能夠加入前面的區間,也能重新開始一個區間。所以我們以此為兩種狀態。

狀態轉移方程:

f[i]=max(f[i-1]+a[i],a[i]).

表示 包含i的區間的最大值,如果f[i-1]為負數,那麽肯定要開辟一個新的區間,此區間暫時只有一個元素即a[i]。

代碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#define
ll long long int using namespace std; const int N=2005; ll n,a[N],f[N],ans=-0x3f3f3f3f; int main(){ scanf("%lld",&n); for(ll i=1;i<=n;i++) scanf("%lld",&a[i]); for(ll i=1;i<=n;i++){ f[i]=max(f[i-1]+a[i],a[i]);//加入前一區間 換新的區間 ans=max(ans,f[i]); } printf(
"%lld",ans); return 0; }

最大子段和