当前位置:网站首页>1007 Maximum Subsequence Sum (25分)

1007 Maximum Subsequence Sum (25分)

2022-08-09 10:48:00 Cutecumber

1007 Maximum Subsequence Sum (25分)

Given a sequence of K integers { N​1, N​2 , …, N​K}. A continuous subsequence is defined to be { N​i, N​i+1, …, N​j} where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.

Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.

Input Specification:

Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (≤10000). The second line contains K numbers, separated by a space.

Output Specification:

For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

Sample Input:

10
-10 1 2 3 4 -5 -23 3 7 -21

Sample Output:

10 1 4

一定要读题啊
If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

我用动态规划做的话会部分错误,估计是子序列的定位出了问题,我暂时还没检查出来,以后有空再改吧,现在忙着刷题。二重循环暴力搜索没问题,就是耗时有点长。

#include <iostream>
using namespace std;
void MaxSubSequence(const int A[], int N){
    
    int ThisSum,MaxSum,i,j;
    int start=0, end=0;
    MaxSum = -1;
    for(i=0;i<N;i++)
    {
    
        ThisSum = 0;
        for(j=i;j<N;j++)
        {
    
            ThisSum += A[j];
            if(ThisSum > MaxSum){
    
                MaxSum = ThisSum;
                start = i;
                end = j;
            }
        }
    }
    if(MaxSum < 0){
    
        cout << 0 <<' '<<A[0]<<' '<<A[N-1] <<endl;
    }
    else
        cout << MaxSum<<' '<<A[start]<<' '<<A[end];
}
void dp(const int A[], int N){
    
    int ThisSum, MaxSum=-1;
    int start = 0, end=0;
    int count = 0;
    for(int i=0; i<N; i++){
    
        count++;
        ThisSum += A[i];
        if(ThisSum > MaxSum){
    
            MaxSum = ThisSum;
            end = i;
            start = i - count + 1;
        }
        else if(ThisSum < 0){
    
            ThisSum = 0;
            count = 0;
        }
    }
    if(MaxSum < 0){
    
        cout << 0 <<' '<<A[0]<<' '<<A[N-1] <<endl;
    }
    else
        cout << MaxSum<<' '<<A[start]<<' '<<A[end] << endl;
}
int main(){
    
    int n;
    int list[10002];
    cin >> n;
    for(int i=0; i<n; i++){
    
        cin >> list[i];
    }
    MaxSubSequence(list, n);
    return 0;
}
原网站

版权声明
本文为[Cutecumber]所创,转载请带上原文链接,感谢
https://blog.csdn.net/SingDanceRapBall/article/details/112794232