hdu 1231 dp(最大连续子序列)

View Code
//hdu 1231  dp(最大连续子序列)

//题目给出一串数字,要求输出 最大连续子序列的 和 
//与序列第一个数和最后一个数
//若所有数都是负的则 和为0,并输出第一个数和最后一个数

//具体看代码


#include <stdio.h>

#define N 50005

int n_num;
int num[N];


int main()
{
    while(scanf("%d", &n_num), n_num)
    {
        for(int i = 0; i < n_num; ++i)
            scanf("%d", &num[i]);

        int sum, ans, st, ed, ans_st, ans_ed;
        //初始化
        ans_st = ans_ed = st = ed = sum = ans = num[0];

        for(int i = 1; i < n_num; ++i)
        {
            if(sum > 0) //若i 之前序列和大于0,则加上i 肯定
            {           //比之前的序列大
                sum += num[i];
                ed = num[i];
            }       //若 i 之前的序列 小于 等于0 则加上 i 肯定更小
            else    //因此 i 自成一个序列
                st = ed = sum = num[i]; 
                
            //若之前的序列为负 第i个为0,则照样更新
            //若得到的序列中 都为 负 则怎么更新 ans 都是负的
            if(ans < sum)   //若 到 i 的序列大于 记录的最大值,
            {               //则记下 序列第一个和最后一个数
                ans_st = st;
                ans_ed = ed;
                ans = sum;      //更新最大值
            }
        }
        if(ans < 0) //若 ans 为负的,则所有序列中肯定没有 0的
            printf("0 %d %d\n", num[0], num[n_num-1]);
        else
            printf("%d %d %d\n", ans, ans_st, ans_ed);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/gabo/p/2450842.html