Max Sum

来源:互联网 发布:free mobile java在线 编辑:程序博客网 时间:2024/06/05 04:51
Given a sequence a11,a22,a33......ann, your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.
Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).
Output
For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.
Sample Input
25 6 -1 5 4 -77 0 6 -1 1 -6 7 -5
Sample Output
Case 1:14 1 4Case 2:7 1 6
可以利用动态规划,设置数组f[i]代表包含第i个数字的最大和,if (f[i-1]>0) f[i]=f[i-1]+a[i]; else f[i]=a[i];记得处理的同时记录下对于此f[i]的开始位置和结束位置。
#include<iostream>#include<string.h>using namespace std;struct node{    int x,y;};int a[100010],f[100010];node mp[100010];int main(){    int T,n,i,num=0,be,en,m,c;    cin>>T;    c=T;    while(T--)    {        memset(f,0,sizeof(f));        num++;        be=1;        en=1;        cin>>n;        for(i=1;i<=n;i++)            cin>>a[i];        m=a[1];        mp[0].x=1;        for(i=1;i<=n;i++)        {            if (f[i-1]>=0)            {                f[i]=f[i-1]+a[i];                mp[i].x=mp[i-1].x;                mp[i].y=i;                if (f[i]>m)                {                    be=mp[i].x;                    en=mp[i].y;                    m=f[i];                }            }            else            {                f[i]=a[i];                mp[i].x=i;                mp[i].y=i;                if (f[i]>m)                {                    be=mp[i].x;                    en=mp[i].y;                    m=f[i];                }            }        }        cout<<"Case "<<num<<":"<<endl;        cout<<m<<" "<<be<<" "<<en<<endl;        if (num!=c) cout<<endl;    }    return 0;}

0 0
原创粉丝点击