代码改变世界

最大字串和问题

2017-04-19 17:21  IBelieve_bin  阅读(179)  评论(0)    收藏  举报

给定一组数字(含负数),求连续的字串的最大的和。
如果不要求输出最大和的起始数字位置,可以直接这样写,比较简单:
每次读入数据后都判断前面几项的和是否大于0,然后不断保存下目前为止最大的和。

 1 #include <iostream>
 2 using namespace std;
 3 int main(){
 4     int n;
 5     int a, b = 0;
 6     int sum = 0; //sum表示最终的最大和
 7     cin >> n;
 8     for (int i = 1; i <= n; i++){
 9         cin >> a;
10         if (b>0) 
11             b += a;
12         else 
13             b = a;
14         if (b > sum){
15             sum = b;
16         }
17     }
18     cout << sum << endl;
19     return 0;
20 }

如果要求输出位置,那么只需要定义三个前后位置和一个temp位置变量,每次更新即可:

 1 #include <iostream>
 2 using namespace std;
 3 int main(){
 4     int n;
 5     int a, b = 0;
 6     int start, end, temp;
 7     int sum = 0;
 8     cin >> n;
 9     for (int i = 1; i <= n; i++){
10         cin >> a;
11         if (i == 1){ //这里只是初始化
12             b = a;
13             sum = a;
14             start = 1;
15             end = 1;
16             temp = 1;
17         }
18         else if (b > 0)
19             b += a;
20         else {//如果之前存储的和加上现在的数据比现在的数据小(也就是b+c<=c),就把存储的和换成现在的数据,反之就说明加上之前的数会变得更大,所以可以加上
21             b = a;
22             temp = i;
23         }
24 
25         if (b > sum){//跟之前算出来的最大和进行比较,如果大于,位置和数据就要重置
26             sum = b;
27             start = temp;
28             end = i;
29         }
30     }
31     cout << sum << " " << start << " " << end << endl;
32     return 0;
33 }