您的位置:首页 > 其它

ACM: 最大连续和O(N) 动态规划 toj…

2016-05-19 23:21 381 查看


                      Max
Sum

描述

 
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.

输入

 
The first line of the
input contains an integer T(1<=T<=25)
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).

输出

 
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.

样例输入
2

5 6 -1 5 4 -7

7 0 6 -1 1 -6 7 -5
样例输出
Case 1:

14 1 4

Case 2:

7 1 6
 
题意: 求最大连续和,
求出序列的起始和末尾.
 
解题思路:
               
1. O(n)的时间复杂度.
 
代码:
#include
<cstdio>

#include <iostream>

#include <cstring>

using namespace std;

#define MAX 100005

const int INF = -(1<<29);
int n;

int a[MAX];

int begin, end;

int maxt;

int sum;
int
main()

{

// freopen("input.txt","r",stdin);

 int i, j;

 int caseNum;

 int NUM = 1;

 scanf("%d",&caseNum);

 for(int k = 1; k <= caseNum;
++k)

 {

  scanf("%d",&n);

  for(i = 0; i <
n; ++i)

   scanf("%d",&a[i]);
  begin = end =
0;

  sum = 0;

  maxt = INF;

  int temp = 0;

  for(i = 0; i <
n; ++i)

  {

   sum +=
a[i];

   if(sum
> maxt)

   {

    end
= i;

    begin
= temp;

    maxt
= sum;

   }

   if(sum
< 0)

   {

    temp
= i+1;

    sum
= 0;

   }

  }

  printf("Case %d:\n",k);

  printf("%d %d
%d\n",maxt,begin+1,end+1);

  if(k != caseNum)

   printf("\n");

 }
 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: