题目

解题思路

首先这是一个最大子序列问题,那读完题后我们发现需要两个变量来存放左和右两个下标,一个temp_sum表示临时最大值,一个sum表示最终最大值,因为最大值在处理的过程中会变得,需要用sum来保存新的最大值。

那么接下来我们需要知道如果当前读入数使得子序列最大值小于0了,即temp_sum<0,那么此时不管候面来什么值,都应该舍弃temp_sum<0前面的子序列,因为负数只会拉低总和不会,所以不要也罢,如果不懂我举个例子,子序列“1、2、3、-9、1”,当读到-6的时候,你会发现sum的值是6,而temp_sum是-3,很明显不能更新sum的值对吧,因为6比-3大,所以直接放弃当前的temp_sum,让他等于0,同时更新temp_index,这个也很关键,如果后面有更大的数字,那么这个temp_index是要充当左端下标给left_point的。

实现代码

#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable:4996)
using namespace std;

int main()
{
#ifdef ONLINE_JUDGE                
#else    
    freopen("1.txt", "r", stdin);
#endif 

    int n;
    cin>>n;

    int left_point=0 , right_point=n-1 , temp_sum=0 , sum=-1 , temp_index=0;
    vector v(n);

    for(int i=0;i>v[i];
        temp_sum=temp_sum+v[i];
        if(temp_sum<0)
        {
            temp_sum=0;
            temp_index=i+1;
        }
        else if(temp_sum>sum)
        {
            sum=temp_sum;
            left_point=temp_index;
            right_point=i;
        }
    }

    if(sum<0) cout<<"0";
    else
    {
        cout<

总结

本题是最大子序列的问题,是一个基础问题,因为他只要求输出最大值、最左边的值和最右边的值。遇到这种题目我们是在读输入的过程中就进行处理。


lionの金库