HDOJ1003Max Sum

简介: HDOJ1003Max Sum

Problem Description

Given a sequence a[1],a[2],a[3]……a[n], 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

2

5 6 -1 5 4 -7

7 0 6 -1 1 -6 7 -5


Sample Output

Case 1:

14 1 4


Case 2:

7 1 6


有2种方法做,我开始不明白题目意思,走了很多弯路。

题目要求是这样的:

输出数组的子序列的最大值。

如果有相同的,开始序列输出小的。

结尾序列输出大的。

/**1003题**/
#include <stdio.h>
#include <stdlib.h>
int a[1000020];
long long int c[3000020],b[1000020];
int main()
{
    int t,tt=1;
    scanf("%d",&t);
    while(t--)
    {
        int i,j,n,a1,a2;
        scanf("%d",&n);
        int age=0;
        if(n!=1)
        {
            for(i=0; i<n; i++)
                scanf("%d",&a[i]);
            long long int sum=0;
            for(i=0; i<n; i++)
            {
                if(a[i]>=0)
                {
                    a1=a2=i+1;
                    age=1;
                    break;
                }
            }
            if(age!=1)
            {
                int max=a[0];
                a1=a2=1;
                for(i=1; i<n; i++)
                {
                    if(a[i]>max)
                    {
                        max=a[i];
                        a1=a2=i+1;
                    }
                }
                printf("Case %d:\n",tt);
                tt++;
                printf("%d %d %d\n",max,a1,a2);
                if(t!=0)
                    printf("\n");
            }
            else
            {
                int k=0;
                c[k]=0;
                long long int max=c[k];
                for(i=a1-1;i<n;i++)
                {
                    c[k]=0;
                    for(j=i;j<n;j++)
                    {
                        c[k]=a[j]+c[k];
                        if(c[k]<0)
                            break;
                        if(max<c[k])
                        {
                            a1=i+1;
                            a2=j+1;
                            max=c[k];
                        }
                        if(max==c[k])
                        {
                            if(a1>i+1)
                                a1=i+1;
                            if(a2<j+1)
                                a2=j+1;
                        }
                    }
                    k++;
                }
                printf("Case %d:\n",tt);
                tt++;
                printf("%I64d %d %d\n",max,a1,a2);
                if(t!=0)
                    printf("\n");
            }
        }
        if(n==1)
        {
            scanf("%d",&a[0]);
            {
                printf("Case %d:\n",tt);
                tt++;
                printf("%d 1 1\n",a[0]);
                if(t!=0)
                    printf("\n");
            }
        }
    }
    return 0;
}
目录
相关文章
LeetCode 209. Minimum Size Subarray Sum
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
116 0
LeetCode 209. Minimum Size Subarray Sum
LeetCode 64. Minimum Path Sum
给定m x n网格填充非负数,找到从左上到右下的路径,这最小化了沿其路径的所有数字的总和。 注意:您只能在任何时间点向下或向右移动。
102 0
LeetCode 64. Minimum Path Sum
HDOJ 2071 Max Num
HDOJ 2071 Max Num
99 0
HDOJ 2071 Max Num
HDOJ 1003 Max Sum
HDOJ 1003 Max Sum
100 0
|
BI 人工智能
HDOJ-1003 Max Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem ...
947 0