九度 1011 最大连续子序列

来源:互联网 发布:网络银行的发展趋势 编辑:程序博客网 时间:2024/05/02 10:44

题目来源:http://ac.jobdu.com/problem.php?pid=1011

    找出最大连续子段和,如果存在多个,输出起始点最小的那个,这个限制就多需要用两个中间变量qs, qe,来存储每个最大字段的起始点,和终止点,如果存在多个最大和相同的话,这个iStartPos, iEndPos存储的就是最初的那个最大子段和的起始点qs,终止点qe!

#include <cstdio>#include <iostream>#include <cstring>#include <climits>using namespace std;const int MAXN = 10000;int main(){    int iMax, iStartPos, iEndPos, qs, qe, arr[MAXN], tmp, n, i;    while(scanf("%d", &n) && n)    {        iStartPos = iEndPos = qs = qe = 0;        scanf("%d", &arr[0]);        tmp = iMax = arr[0];        for(i = 1; i < n; ++i)        {            scanf("%d", &arr[i]);            if(tmp >= 0)                tmp += arr[i], qe = i;            else                tmp = arr[i], qs = qe = i;            if(iMax < tmp)                iMax = tmp, iStartPos = qs, iEndPos = qe;        }        if(iMax < 0)            iStartPos = 0, iEndPos = n-1, iMax = 0;        printf("%d %d %d\n", iMax, arr[iStartPos], arr[iEndPos]);    }    return 0;}


0 0
原创粉丝点击