/* 题目内容:
给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+…+a[j]和最大.或者求出最大的这个和.例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4].
输入描述
第一行为一个整数n,表示数组有n个数据,第二行依次输入n个整数
输出描述
计算出n个整数中连续k个数的最大和的那个k个连续的数
输入样例
输出样例
*/
思路: 原始数组a[], 辅助数组b[], b[i]记录了以a[i]为终点的最大字段和,maxs = max{b[0], b[1], b[2] .....};
if(b[i-1] > 0 , b[i] = a[i] + b[i -1];
可以根据b来构造最大和字段,从计算b[i]的递推关系可以看出,如果b[i]是最大字段和,则a[i]是字段的最后一个元素,从a[i]往前的第一个满足b[i] = a[i]的元素就是 字段和的首元素。
//借鉴前一题
#include <iostream>
using namespace std;
int a[10000];
int f[10000];
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
f[0] = a[0];
int max = a[0];
for(int i = 1; i < n; i++){
if(f[i - 1] > 0)
f[i] = f[i - 1] + a[i];
else
f[i] = a[i];
if(max < f[i])
max = f[i];
}
int x = 0, y = 0, flagx = 1;
for(int i = n - 1; i >= 0; i--){
if(max == f[i] && flagx){
x = i;
flagx = 0;
}
y = x;
if(f[i] < 0)
{ y = i + 1;
break;
}
}
// cout << y << " " << x << endl;
for(int i = y; i <= x; i++)
cout << a[i] << " ";
return 0;
}
#include <iostream> using namespace std; int main(){ int n = 0, a[100] = {0}, b[100] = {0}; int max = -111111111, xmax = 0, ymax = 0; cin >> n; for(int i = 1; i <= n; i++){ cin >> a[i]; if(b[i - 1] > 0) b[i] = a[i] + b[i - 1]; // b[i]记录以a[i]为终点的最大字段和 else b[i] = a[i]; if(max < b[i]){ max = b[i]; xmax = i; //记录最大字段和的结束位置 } } for(int i = xmax; i >= 1; i--){ //记录最大字段和的开始位置 if(a[i] == b[i]){ ymax = i; break; } } cout << max << endl; cout << ymax << " " << xmax << endl; return 0; }