最大字串和问题
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 }
浙公网安备 33010602011771号