HDU 1003 Max Sum(动态规划)
2015-07-30 11:26
441 查看
题目链接:Click here
题意:给定一个数组,求最大和子序列的值以及子序列的起始点和结束点。
思路:DP嘛~~
当sum值大于最大值时,就记下最大值以及这个值对应的左起和右终的下标。
当sum<0时,证明加上当前数整个数值为负,这个负数一定不会是下一个最大子序列的成员,所以起始点要从当前位置的下一位开始, sum也要从新开始,因为下一个数一定比它加一个负数要大。
如果数组全是负数,那么就是说sum加上那一个负数sum就小于0了。因此每个负数都是一个连续子序列。就看哪个负数最大了。因为每次只要sum<0就会将sum重新清0,所以负数情况完全和正数一起处理了。
题意:给定一个数组,求最大和子序列的值以及子序列的起始点和结束点。
思路:DP嘛~~
当sum值大于最大值时,就记下最大值以及这个值对应的左起和右终的下标。
当sum<0时,证明加上当前数整个数值为负,这个负数一定不会是下一个最大子序列的成员,所以起始点要从当前位置的下一位开始, sum也要从新开始,因为下一个数一定比它加一个负数要大。
如果数组全是负数,那么就是说sum加上那一个负数sum就小于0了。因此每个负数都是一个连续子序列。就看哪个负数最大了。因为每次只要sum<0就会将sum重新清0,所以负数情况完全和正数一起处理了。
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <cstdlib> using namespace std; int main() { int n, a[100005], s, e, sum, maxx, t, temp; scanf("%d", &t); for(int k = 1; k <= t; k++) { scanf("%d", &n); sum = 0; maxx = -10000000; temp = 1; for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); sum += a[i]; if(sum > maxx) { maxx = sum; s = temp; e = i; } if(sum < 0) { sum = 0; temp = i + 1; } } printf("Case %d:\n", k); printf("%d %d %d\n", maxx, s, e); if(k != t) printf("\n"); } return 0; }
相关文章推荐
- UIView的autoresizingMask属性探究
- hdu5323 多校题
- CtreeCtrl的常用方法
- Spring中什么时候用@Resource,什么时候用@service
- willMoveToParentViewController和didMoveToParentViewController
- 提高Ajax速度的几点方法
- 3DES Jni
- hdoj 5240 Exam 【模拟】
- UIView的autoresizingMask属性探究
- Linux的操作系统I2C驱动架构解说
- 【Windows编程】系列第七篇:Menubar的创建和使用
- ListView学习笔记
- RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能
- android_mvp理解与代码示例
- hdu3949:XOR
- spring中bean的作用域
- uibuttton中的等价替换(方便实用)
- 设计模式——观察者模式
- RadioButton单选按钮
- fragment小结