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
- hdu 1231 最大连续子序列 【最大连续子串】
- hdu 1231 最大连续子序列
- hdu 1231 最大连续子序列
- hdu 1231 最大连续子序列和
- hdu 1231 最大连续子序列(DP)
- HDU-1231 最大连续子序列
- HDU 1231 最大连续子序列 (dp)
- HDU 1231 最大连续子序列
- hdu 1231最大连续子序列 【DP】
- hdu 1231 最大连续子序列
- hdu 1231 最大连续子序列
- HDU 1231 最大连续子序列
- hdu 1231 最大连续子序列
- hdu 1231 最大连续子序列
- hdu 1231最大连续子序列
- HDU-1231-最大连续子序列
- hdu 1231 最大连续子序列
- hdu 1231 最大连续子序列 (dp)
- 深复制和浅复制
- 真机Win7 64位,虚拟机MAC OS X 10.11用NAT无法上网问题,ip 169.254.xxx.xxx
- 能够提高开发效率的Eclipse实用操作
- 深复制和浅复制(二)
- 三种JAVA常用实现字符串反转(Reverse)的方法
- HDU 1231 最大连续子序列
- CSS3基础入门学习: 背景制作实例!
- 232. Implement Queue using Stacks
- Android开发架构规范
- 有序数组,插入一个数后还保证有序
- Java enum的用法详解
- MAVEN 实践 探讨====一个真实的故事
- Java实现链式队列
- C++Operator