HDOJ_ACM_Max Sum

本博客介绍了一个算法,用于找出给定整数序列中连续子序列的最大和,包括序列长度、起始位置和结束位置。通过两种不同的方法实现,一种是在所有可能的子序列中查找最大和,另一种是在所有正数中找到最大和,同时处理负数跳过的问题。
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
 
Code
two programs are all accepted.
View Code
 1 //input, then two for, record begin, end and the max
 2 #include <stdio.h>
 3 #define N 100000
 4 int f[N + 5];
 5 int main()
 6 {
 7     int T, n, i, j, k, t, begin, end, max, sum;
 8     scanf("%d", &T);
 9     for (k = 1; k <= T; k++)
10     {
11         //input
12         scanf("%d", &n);
13         for (t = 0; t < n; t++)
14             scanf("%d", &f[t]);
15         //find the result
16         for (max = -1001, begin = 0, i = 0; i < n; i++)
17         {
18             for (sum = 0, j = i; j < n; j++)
19             {
20                 sum += f[j];
21                 //if sum is bigger than max, then record.
22                 if (sum > max)
23                 {
24                     begin = i;
25                     end = j;
26                     max = sum;
27                 }
28                 //if sum is smaller than zero, then jump to j. ★
29                 if (sum < 0)
30                 {
31                     i = j;
32                     break;
33                 }
34             }
35         }
36         //formatting printing
37         printf("Case %d:\n", k);
38         printf("%d %d %d\n", max, begin + 1, end + 1);
39         if (k != T)
40             puts("");
41     }
42     return 0;
43 }
View Code
 1 //input, then two for, record begin, end and the max
 2 #include <stdio.h>
 3 #define N 100000
 4 int f[N + 5];
 5 int main()
 6 {
 7     int T, n, i, j, k, t, begin, end, max, sum, flag;
 8     scanf("%d", &T);
 9     for (k = 1; k <= T; k++)
10     {
11         flag = 0;
12         //input
13         scanf("%d", &n);
14         for (t = 0; t < n; t++)
15         {
16             scanf("%d", &f[t]);
17             if (f[t] > 0)
18                 flag = 1;
19         }
20         max = -1001;
21         begin = 0;
22         //if flag is equal to zero which means the all number is small than zero
23         if (flag == 0)
24         {
25             for (i = 0; i < n; i++)
26             {
27                 if (f[i] > max)
28                 {
29                     max = f[i];
30                     begin = i;
31                     end = i;
32                 }
33             }
34         }
35         else 
36         {
37             for (i = 0; i < n; i++)
38             {
39                 sum = 0;
40                 //if the begin number is small than zero, then jump.
41                 if (f[i] < 0)
42                     continue;
43                 for (j = i; j < n; j++)
44                 {
45                     sum += f[j];
46                     //if sum is small than zero, then jump.
47                     if (sum < 0)
48                         break;
49                     if (sum > max)
50                     {
51                         begin = i;
52                         end = j;
53                         max = sum;
54                     }
55                 }
56             }
57         }
58         printf("Case %d:\n", k);
59         printf("%d %d %d\n", max, begin + 1, end + 1);
60         if (k != T)
61             puts("");
62     }
63     return 0;
64 }

The first one

for example, 4 4 -5 1 2. when i = 1, j = 2, then sum = 4 + -5 = -1, then make i = j = 2. Because the sum of the before number is samller than zero, you can start with postive interger.

The second one

the program judge whether all number is  negative, when it is negative, just find the max number and the position. Besides, when it begin with negative number, you can jump.

Note the two programs is different.

 

转载于:https://www.cnblogs.com/chuanlong/archive/2012/11/12/2767137.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值