【HDU1003】【Max Sum】【2种代码】
2015-08-03 19:41
344 查看
Max Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 177615 Accepted Submission(s): 41422
Problem Description
Given a sequence a[1],a[2],a[3]......a
, your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.
Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).
Output
For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence.
If there are more than one result, output the first one. Output a blank line between two cases.
Sample Input
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Sample Output
Case 1: 14 1 4 Case 2: 7 1 6
Author
Ignatius.L
Recommend
#include <iostream> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <list> #include <map> #include <set> #include <string> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; int T; int N; const int maxn = 100010; int a[maxn]; int dp[maxn]; int path[maxn]; int main() { scanf("%d",&T); int Case = 1; while(T --) { scanf("%d",&N); for(int i=1;i<=N;i++) { scanf("%d",&a[i]); } memset(dp,-0x3f3f3f3f,sizeof(dp)); dp[0] = 0; path[0] = 1; for(int i=1;i<=N;i++) { if(a[i] > dp[i-1] + a[i]) { path[i] = i; } else { path[i] = path[i-1]; } dp[i] = max(a[i],dp[i-1] + a[i]); } int maxs = -0x3f3f3f3f; int r,l; for(int i=1;i<=N;i++) { if(dp[i] > maxs) { maxs = dp[i]; l = path[i]; r = i; } } if(Case >= 2) { printf("\n"); } printf("Case %d:\n",Case++); printf("%d %d %d\n",maxs,l,r); } return 0; }
#include <iostream> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <list> #include <map> #include <set> #include <string> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; int T; int main() { int C = 1; scanf("%d",&T); int n; int c,s,p,l,r,ans; while(T--) { c = ans = -0x3f3f3f3f; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&s); if(c >= 0) c += s; else {c = s,p=i;} if(c > ans) { ans = c; l = p; r = i; } } printf("Case %d:\n%d %d %d\n%s",C++,ans,l+1,r+1,T==0?"":"\n"); } return 0; }
相关文章推荐
- 【effective c++读书笔记】【第4章】设计与声明(2)
- 【effective c++读书笔记】【第4章】设计与声明(2)
- Python中的print语句
- Java基础知识
- python常用函数
- Eclipse删除workspace的技巧
- Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8
- MATCOM & C++ &数学表达式计算
- C++ 计蒜客算法基础入门最长上升子序列
- c/c++----------虚函数、虚继承、纯虚函数
- java类与对象
- C语言深度解剖——读书笔记-11、指针和数组
- java 使用查表法将十进制转换成十六进制其他进制
- Jenkins + GitHub + fir-cli 一行命令从源码到fir.im
- 黑马程序员 c语言的基础
- java环境搭建
- java 实现线程同步的方式有哪些
- java_ EngorgeSnake
- springMVC 体验springMVC
- A. Gerald's Hexagon