描述
Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:
Your task is to calculate d(A).
输入
The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input.
Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case.
输出
Print exactly one line for each test case. The line should contain the integer d(A).
样例输入
样例输出
提示
In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.
Huge input,scanf is recommended. 题意:
t1 t2 d(A) = max{ ∑ai + ∑aj | 1 <= s1 <= t1 < s2 <= t2 <= n } i=s1 j=s2
Your task is to calculate d(A).
Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case.
1 10 1 -1 2 2 3 -3 4 -4 5 -5
13
Huge input,scanf is recommended. 题意:
就是找到两个字段和,找出最大的和,输出,中间不能有重叠
分析:
就是从左到右找每个i处的最大子段和,在从右到左,最后统计和的最大值
代码:
#include<bits/stdc++.h>
using namespace std;
long long int f[50005],h[50005],maxn,temp,p;
int main()
{
int a[50005],n,i,t,k;
while(cin>>t)
{
for(k=0;k<t;k++){
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
memset(f,0,sizeof(f));
memset(h,0,sizeof(h));
for(i=1,temp=0,h[0]=-10005;i<=n;i++)
{
if(temp<0)
temp=0;
temp+=a[i];
if(temp>h[i-1])
h[i]=temp;
else
h[i]=h[i-1];
}
for(i=n,temp=0,f[n+1]=-10005;i>0;i--)
{
if(temp<0)
temp=0;
temp+=a[i];
if(temp>f[i+1])
f[i]=temp;
else
f[i]=f[i+1];
}
for(i=1,maxn=-100000;i<n;i++)
{
p=f[i+1]+h[i];
if(p>maxn)
maxn=p;
}
cout<<maxn<<endl;
}
}
}
感受:
一开始老是出不来,因为我没有处理好重叠部分的问题,最后想到了算f[i]+h[i-1],不过想出来就感觉自己棒棒哒