Maximum sum(信息学奥赛一本通-T1305)
生活随笔
收集整理的這篇文章主要介紹了
Maximum sum(信息学奥赛一本通-T1305)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
對于給定的整數序列A={a1,a2,...,an},找出兩個不重合連續子段,使得兩子段中所有數字的和最大。我們如下定義函數 d(A):
我們的目標就是求出d(A)。
【輸入】
第一行是一個整數T(≤30),代表一共有多少組數據。
接下來是T組數據。
每組數據的第一行是一個整數,代表數據個數據n(2≤n≤50000) ,第二行是nn個整數a1,a2,...,an(|ai|≤10000)。
【輸出】
輸出一個整數,就是d(A)的值。
【輸入樣例】
1
10
1 -1 2 2 3 -3 4 -4 5 -5
【輸出樣例】
13
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 50001 #define MOD 50001 #define E 1e-12 using namespace std; int a[N]; int leftt[N],rightt[N]; int leftmax[N],rightmax[N]; int main() {int t;cin>>t;while(t--){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];leftt[1]=a[1];leftmax[1]=a[1];rightt[n]=a[n];rightmax[n]=a[n];for(int i=2;i<=n;i++)leftt[i]=max(a[i],leftt[i-1]+a[i]);for(int i=n-1;i>=1;i--)rightt[i]=max(a[i],rightt[i+1]+a[i]);for(int i=2;i<=n;i++)leftmax[i]=max(leftmax[i-1],leftt[i]);for(int i=n-1;i>=1;i--)rightmax[i]=max(rightmax[i+1],rightt[i]);int ans=a[1];for(int i=2;i<=n;i++)ans=max(ans,leftmax[i-1]+rightmax[i]);cout<<ans<<endl;}return 0; }?
總結
以上是生活随笔為你收集整理的Maximum sum(信息学奥赛一本通-T1305)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暑期训练日志----2018.8.17
- 下一篇: Knight Moves(信息学奥赛一本