//最大字段和{-1,3,-1,6,-3}
//1 枚举法
//列举所有的字段
//以-1开始的{-1},{-1,3},{-1,3,-1}。。。
//以-3开始的{-3}。
int max_sum(int *arr, int n){
int sum = arr[0];
for (int i = 0; i < n; ++i){
int this_sum = 0;
for (int j = i; j < n; ++j){
this_sum += arr[j];
if (this_sum > sum){
sum = this_sum;
}
}
}
return sum;
}
int max_sum_range(int* arr, int n, int& first, int& last){
int sum = arr[0];
first = last = 0;
for (int i = 0; i < n; ++i){
int this_sum = 0;
for (int j = i; j < n; ++j){
this_sum += arr[j];
if (this_sum > sum){
sum = this_sum;
first = i;
last = j; //记录区间
}
}
}
return sum;
}
//动态规划
//用this_sum[]存储当前的字段最大和
//max存储历史最大
//对每次更新this_sum[i]来说,如果this_sum[i-1] < 0则this_sum[i]=this_sum[i-1]
//且当前的first = i
//如果this_sum[i-1] >= 0 则this_sum[i] = this_sum[i-1] + a[i];
//更新max来说 当this_sum[i] > max
//max = this_sum[i]
//first= 当前first
//last = i;
int max_sum_range_2(int* arr, int n, int& first, int& last){
int* this_sum = new int[n];
int max = arr[0];
first = last = 0;
int min;
for(int i = 1; i < n;++i){
if(this_sum[i-1] >= 0){
this_sum[i] = this_sum[i-1] + arr[i];
}else{
min = i;
this_sum[i] = arr[i];
}
if(this_sum[i] > max){
max = this_sum[i];
last = i;
first = min;
}
}
delete[] this_sum;
return max;
}
int main(){
int arr[4]{-9, 14, -17, -18};
cout << "枚举" << endl;
cout << max_sum(arr, 4) << endl;
int first, last;
cout <<endl<< "枚举" << endl;
cout << max_sum_range(arr, 4, first, last) << endl;
for (int i = first; i <= last; ++i){
cout << arr[i] << ends;
}
cout << endl<< "动规" << endl;
cout << max_sum_range_2(arr, 4, first, last) << endl;
for (int i = first; i <= last; ++i){
cout << arr[i] << ends;
}
return 0;
}
最大子段和
最新推荐文章于 2020-11-23 21:35:42 发布