1007 Maximum Subsequence Sum - 最大連續子序
阿新 • • 發佈:2018-11-09
思路:
原則是:用now表示當前的判斷,在把多個元素加和的時候,若加到a[i]的時候小於0,那麼捨去a[i],繼續向後判斷,設ans=-1記錄最大值(設為-1的原因是要處理0開頭的情況)
若sum==0那麼我們不要(題上要求i,j最小),但如果第1個數是0那麼就要
用tleft表示臨時的左節點,當ans>now的時候更新left=tleft,right=a[i]
最後判斷一下全負的情況
程式碼如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<queue> #include<cmath> #include<set> #define ll long long using namespace std; const int N=10005; int a[N]; int main(){ int k; scanf("%d",&k); for(int i=1;i<=k;i++){ scanf("%d",&a[i]); } int ans=-1,now=0,tleft=1,left,right; for(int i=1;i<=k;i++){ now+=a[i]; if(now>ans){ ans=now; left=tleft; right=i; } else if(now<0){ now=0; tleft=i+1; } } if(ans<0){left=1;right=k;ans=0;} printf("%d %d %d\n",ans,a[left],a[right]); }