杭电 1003

Max Sum

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 142647    Accepted Submission(s): 33192

Problem Description

Given a sequence a[1],a[2],a[3]......a[n], 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

这道题的题目虽然是大数 但是不用大数也是能够做得出来的

题目的意思就是给你一段数字,开头还有结尾都是可以变化的,

在两者都不确定的情况下,让你求最长和的子列,并且将最

大的值,子列的起始位置,终止位置给输出来;

这是简单的dp问题

代码如下:

#include<stdio.h>

int main()

{

int n;

int max,i,j,m,start,end,k,temp,a;

scanf("%d",&n);

for(i=0;i<n;i++)//此处写成while(n--)也行 但是后面对case值的变化 要多一个变量进行描述

{

max=-1001;

end=start=k=temp=0;

scanf("%d",&m);

for(j=0;j<m;j++)

{

scanf("%d",&a);

temp+=a;//temp起到了缓存的效果,将总和的值加起来之后再与最大值比较

if(temp>max)

{

max=temp;

start=k;

end=j;

}

if(temp<0)//此处要是前面的和小于零 说明 不可能从其那面开始 所以其实位置也要发生变化

{

temp=0;

k=j+1;

}

}

printf("Case %d:\n",i+1);

printf("%d %d %d\n",max,start+1,end+1);

if(i!=n-1)

printf("\n");

}

return 0;

}

杭电 1003

时间: 2024-11-08 02:42:50

杭电 1003的相关文章

杭电 1003 Max Sum

http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 142781    Accepted Submission(s): 33242 Problem Description Given a sequence a[1],a[2],a[3

杭电1003(Max Sum) 首次dp

点击打开杭电1003 Problem Description Given a sequence a[1],a[2],a[3]......a[n], 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 inp

杭电1003 Max Sum 【连续子序列求最大和】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目意思: 即给出一串数据,求连续的子序列的最大和 解题思路: 因为我们很容易想到用一个max来存放找到的子序列的和中的最大值,通过不断比较,对max的值进行更新,最后我们就能够得到最大子序列的和,于是很容易想到用暴力搜索,见上一篇博客,这样的时间复杂度为O(n^3),是超时的. 又因为想到只要一个数不是负数,不管它再小,加上去也是会使和变大的,所以我们需要用另一个变量来判断即将要加上的一个

杭电1003

1 #include<stdio.h> 2 3 int a[100005],dp[100005]; 4 5 int main() 6 { 7 int n,m,i,maxn,xx,yy,x,y,t; 8 while(~scanf("%d",&n)) 9 { 10 for(t=0; t<n; ++t) 11 { 12 scanf("%d",&m); 13 for(i=0; i<m; ++i) 14 scanf("%d&q

杭电1003 Max Sum TLE

这一题目是要求连续子序列的最大和,所以在看到题目的一瞬间就想到的是把所有情况列举出来,再两个两个的比较,取最大的(即为更新最大值的意思),这样的思路很简单,但是会超时,时间复杂度为O(n^3),因为有三重for语句 #include<stdio.h> #define maxn 101000 int main() { int ncase,flag=1,n,max,sum=0,h,z,a[maxn]; long i,j,k; scanf("%d",&ncase); wh

杭电1003动态规划

抄过来的学习下: import java.util.Scanner; /* O(N^3)这中方法就是采用暴力法咯,把所有情况都列出来!假设我们要求i--j这段下标的序列和,i从1-n,j也从1-n,有因为求i--j求和要便利一遍,最好情况是只遍历一遍 最坏是遍历n次,折中也就是n/2,所以是O(n^3); 但是我们知道,i肯定要小于j的咯,所以我们就把j从i--n循环就可以了!这可以小小优化一下, 第三种方法就是动态规划了 f(x+1)=f(x)>=0?f(x)+a[i]:a[i];用我代码中变

杭电1003 最大连续子串

6 -1 5 4 -7 #include<iostream> using namespace std; int main(){ int t,n,a,max,sum,start,end,temp; while(cin>>t){ for(int i=1;i<=t;i++){ cin>>n; max=-1001; temp=1; sum=0; for(int i=1;i<=n;i++){ cin>>a; sum+=a; if(max<sum){

HDU 4937 (杭电多校 #7 1003题)Lucky Number(瞎搞)

题目地址:HDU 4937 多校的题以后得重视起来...每道题都错好多次...很考察细节.比如这道....WA了无数次.... 这题的思路自己真心想不到...这题是将进制后的数分别是1位,2位,3位和更多位的分开来计算. 当是1位的时候,显然只有3到6,此时只能是-1 当是2位的时候,可以转换成一元一次方程求解 当是3位的时候,可以转换成一元二次方程求解 当是4位的时候,此时最多也只有7000个数,7000^3接近1e12.所以剩下的直接枚举进制数来判断即可. 代码如下: #include <i

HDU 4923 (杭电多校 #6 1003题)Room and Moor(公式+栈)

题目地址:HDU 4923 比赛的时候脑残了..思路完全想出来了..只不过想出了个根本不可能存在的极端数据,然后一看输入数据是100组,就把自己给否决了...sad..当时就应该大胆试一试的... 这个题首先可以把最前面的0和最后面的1去掉,因为这两块总可以用0和1抵消掉.然后中间就分成了10相间的情况,然后根据10相间,可以分成若干组,每一组都是由几个1和几个0组成的.比如说1101101110,就可以分成110,110,1110这样的三组. 然后这时候可以可以对每一组内只取一个数来使得这组的