题目大意
求最大子列和,并输出和、第一个数、第二个数。如果全为负数,则定义和为0,并输出第一个数和最后一个数。
思路解析
这是一道动态规划的问题,思想是把前面的几个数相加之和看为一个新数,如果这个数为负数则肯定不是最大子列,因为相当于第一个数就是负数了,不管最后加什么都会减小。
比如:
-10 1 2 3 4 -5 -23 3 7 -21 第一个数为负数,果断舍弃
1 2 3 4 -5 -23 3 7 -21 头两个相加,得:
3 3 4 -5 -23 3 7 -21 头两个相加,得:
6 4 -5 -23 3 7 -21 头两个相加,得:
10 -5 -23 3 7 -21 头两个相加,得:
5 -23 3 7 -21
-18 3 7 -21 第一个数为负数,果断舍弃
3 7 -21 头两个相加,得:
10 -21头两个相加,得:
-11 第一个数为负数,果断舍弃
每一次相加的头元素就是当前序列的子列和,在这些和里面选出最大的就是该题所求得最大子列和。
示例代码
#include<iostream>
#include<vector>
using namespace std;
int main() {
int m; cin >> m;
vector<int> vec(m);
int sum = -1;
int low = 0, high=m-1, temp = 0,lastlow=0;
for (int i = 0; i < m; i++) {
cin >> vec[i];
temp += vec[i];
if (temp < 0) {
low = i+1;
temp = 0;
}
else if(temp > sum){
lastlow = low;
sum = temp;
high = i;
}
}
if (sum < 0) sum = 0;
cout << sum << " " << vec[lastlow] << " " << vec[high] << endl;
return 0;
}