HDOJ 1003 Max Sum

 

题意: 给定一个数组序列,求连续的一段子序列之和最大,并输出其和以及起始位置和终止位置。

思路:第一道DP题目,sum[i] 表示以i 为终点的最大和,起始位置用st[i]保存。

 

6959568 2012-10-21 10:29:52 Accepted 1003 15MS 1392K 732 B C++ 罗维

 

 

View Code
#include <iostream>
using namespace std;

#define N 100002

int a[N];
int sum[N];  //以sum[i] 为终点的最大值
int st[N];   //以位置i向前扩展
int main()
{
    int t, n;
    int maxx, tmp;
    int i, j;
    int it = 1;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d", &n);
        for (i=1; i<=n; i++)
            scanf("%d", &a[i]);
        sum[1] = a[1];
        maxx = a[1];
        tmp = 1;
        st[1] = 1;
        for (i=2; i<=n; i++)
        {
            if (sum[i-1]>= 0)  //只要不是负数就加进来
            {
                sum[i] = sum[i - 1] + a[i];
                st[i] = st[i - 1];
            }
            else
            {
                sum[i] = a[i];
                st[i] = i;
            }
            if (sum[i] > maxx)
            {
                maxx = sum[i];
                tmp = i;
            }
        }
        printf("Case %d:\n", it++);
        printf("%d %d %d\n",maxx,st[tmp], tmp );

        if(t > 0)
            printf("\n");
    }
    return 0;
}

 

 

posted @ 2012-10-22 10:29  旅行的蜗牛  阅读(129)  评论(0编辑  收藏  举报