HDU 1003 Max Sum(最长连续子序列和)
2016-07-21 00:42
295 查看
题目链接;
HDU 1003 Max Sum
题意:
求最长连续子序列和,并输出子序列的起始和终止位置。
数据范围:n≤105,−1000≤每个数≤103。
多解时,输出第一个序列的起始和终止位置。
分析:
直接看代码吧。
用sum记录当前连续子序列的和,当sum<0和sum>ans时需要更新,再设置一个东西记录下当前连续子序列的起始位置就好了。
时间复杂度:O(n)。
PS:这题杭电上A的人好多啊,足足5万多。。。。
HDU 1003 Max Sum
题意:
求最长连续子序列和,并输出子序列的起始和终止位置。
数据范围:n≤105,−1000≤每个数≤103。
多解时,输出第一个序列的起始和终止位置。
分析:
直接看代码吧。
用sum记录当前连续子序列的和,当sum<0和sum>ans时需要更新,再设置一个东西记录下当前连续子序列的起始位置就好了。
时间复杂度:O(n)。
PS:这题杭电上A的人好多啊,足足5万多。。。。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <climits> #include <cmath> #include <ctime> #include <cassert> #define IOS ios_base::sync_with_stdio(0); cin.tie(0); using namespace std; typedef long long ll; const int MAX_N = 100010; int data[MAX_N]; int T, n, ans, sum, st, ed, cases = 0; int main() { scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i = 0; i < n; ++i) { scanf("%d", &data[i]); } ans = -2000, st = sum = 0; int pre = 0; for(int i = 0; i < n; ++i) { sum += data[i]; if(sum > ans) { ans = sum; st = pre, ed = i; } if(sum < 0) { sum = 0; pre = i + 1; } } if(cases) printf("\n"); printf("Case %d:\n", ++cases); printf("%d %d %d\n", ans, st + 1, ed + 1); } return 0; }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- HDU 1568
- HDU1290
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp