最大子段和
阿新 • • 發佈:2018-10-01
重新開始 最大子段和 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> #definell 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; }
最大子段和