hdu 1231 最大连续子序列

来源:互联网 发布:vb的编程机制是 编辑:程序博客网 时间:2024/06/03 19:13

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231


题目描述:

Description

给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., 
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个, 
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 
为20。 

在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该 
子序列的第一个和最后一个元素。 

Input

测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。 

Output

对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元 
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。 

Sample Input

6-2 11 -4 13 -5 -210-10 1 2 3 4 -5 -23 3 7 -2165 -8 3 2 5 01103-1 -5 -23-1 0 -20

Sample Output

20 11 1310 1 410 3 510 10 100 -1 -20 0 0          Huge input, scanf is recommended.

分析:这题如果不限制时间的话那么相信很多人都可以做的出来,3个或两个for循环都可以很简单的做出来,但是考虑到这是一道动态规划的题目,那么按照常规的思路肯定会超时,这里就需要我们换一种思路,只用一个for循环来解决,用l和r来记录符合条件的子序列的左右两端,term变量来记录当前我们正在处理的子序列的最左端,如果我们处理的这个子序列和sum的值>Max的值,那么就把sum的值赋给Max,同时把term的值给l,此时的最右端显然是i,所以把i的值给r,用这种思想,从前往后扫一遍自然就能得到结果(详见代码)。


AC代码:

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;int N[10005],Max,sum,l,r,term,sign,K;int main(){    while(1)    {        cin>>K;        if(K==0)            {                break;            }        sign=0;        sum=0;        Max=-0xffffff;        l=1;        r=1;        term=1;        for(int i=1;i<=K;i++)        {            cin>>N[i];            if(N[i]>=0)            {                sign=1;//记录是不是全是负数            }            sum+=N[i];            if(sum>Max)//sum值大于Max就进行处理            {                Max=sum;                l=term;                r=i;            }            if(sum<0)//如果sum<0,那么就重新赋初值0,因为一个最大和子序列不可能是从负数开始的            {                sum=0;                term=i+1;//下一个子序列是从i+1开始的,因为着了的sum值并没有把N[i]记录进去            }        }                if(sign)//不是是负数            cout<<Max<<" "<<N[l]<<" "<<N[r]<<endl;        else//全是负数            cout<<0<<" "<<N[1]<<" "<<N[K]<<endl;    }    return 0;}


1 0
原创粉丝点击