HDU 1231 最大连续子序列

来源:互联网 发布:windows 10 dpi 编辑:程序博客网 时间:2024/06/05 10:55

这里写图片描述
这里写图片描述

题目大意:就是给你k个数,让你打印这k个数最大连续子序列和。如果k个数全部都为负数那么定义其最大和为0,输出第一个和最后一个数。

解题思路:这道题可以去用dp的思想去做,首先除外全部输入的数是负数的情况。我们肯定是定义第一数为最大和,首尾也是第一个。我们利用一个for循环去遍历和sum,当这个sum大于0 让这个sum继续加下去,右边的数就变成当前加的数。如果sum小于等于0 就把当前sum赋值为当前遍历到的这个数,因为不可能全部为负数,肯定有正数,把左,右边的数换成当前遍历的这个数。当sum大于以往遍历的最大连续和,我们就把最大的元素,首尾全部换掉。

下面我就上代码了 当然不能忘记全部为负数的情况!!!!!!

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <map>#include <cmath>#include <queue>#include <string>#include <vector>using namespace std;const int maxn=10005;int k,beginnum,endnum;int a[maxn];int main(){    while(~scanf("%d",&k))    {        if(k==0)          break;        int num=0;        for(int i=1;i<=k;i++)        {          scanf("%d",&a[i]);          if(a[i]<0)            num++;        }        if(num==k)//如果全部为负数的情况        {            printf("0 %d %d\n",a[1],a[k]);            continue;        }       int left=a[1];//初始化       int right=a[1];//初始化       int maxs=a[1];//初始化       int sum=a[1];//初始化       beginnum=a[1];//初始化       endnum=a[1];//初始化        for(int i=2;i<=k;i++)        {           if(sum>0)           {               sum+=a[i];               right=a[i];//换掉右边的数           }           if(sum<=0)           {               sum=a[i];//重新开始 因为不可能全部为负数 有正数               left=a[i];//因为重新开始 左边的数换掉               right=a[i];//换掉右边的数           }           if(sum>maxs)           {               maxs=sum;//当遍历过程中有大于当前的最大连续子序列的和 换掉               beginnum=left;//更新首的数               endnum=right;//更新尾的数           }        }        printf("%d %d %d\n",maxs,beginnum,endnum);    }    return 0;}

END!!!!!!!!!!!!!!!!!!

1 0
原创粉丝点击