循环数组的最大子段和
生活随笔
收集整理的這篇文章主要介紹了
循环数组的最大子段和
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
問題描述:
N個整數組成循環序列,求這個序列的最大子段和。
例如:-2 ??11 ?-4 ?13 ?-5 ?-2 ? ?ANSWER: 20
?
解決:
解決這個問題需要有求解最大子段和的基礎。
循環數組的最大子段和有兩種情況: 一種是普通情況,另一種就是跨越一部分頭和尾的情況。
對于第二種情況,如果擁有最大和的子段跨越了頭和尾,那這時,中間的那一段就是一個 “最小子段和” ,因為序列的總和是一定的。
那么,怎么知道這個最小子段在哪里呢,我們只要把所有的數都取負,再求一次最大子段和就可以了。
那么也就是說,循環數組的最大子段和,就是求了兩次最大子段和。
?
#include<cstdio> #include<algorithm> #include<cstring> #define ll long long using namespace std; ll a[50005],b[50005]; ll mxsub(ll a[],int n) {ll sum=-999999999,b=0;for(int i=0;i<n;i++){if(b>0) b+=a[i];else b=a[i];if(b>sum) sum=b;}return sum; } int main() {int n; while(scanf("%d",&n)!=EOF){ll s=0;for(int i=0;i<n;i++){scanf("%lld",&a[i]); //輸入序列s+=a[i]; // 求整個序列的和b[i] = -a[i]; // 把整個序列取負放在另一個序列里}ll ans=mxsub(a,n); // 普通情況下的最大子段和ll ans2=s + mxsub(b,n); // 跨越頭和尾的ans = max(ans,ans2); // 兩者取大printf("%lld\n",ans);}return 0; }?
?
如果有什么不對的地方,還請各位大神批評指正~
轉載于:https://www.cnblogs.com/ember/p/4716489.html
總結
以上是生活随笔為你收集整理的循环数组的最大子段和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS第八天(1:UITableView
- 下一篇: ASP.NET MVC和jQuery D