/*
最大子序列和
*/
#include <iostream>
#include <algorithm>
using namespace std;
// 暴力枚举
int MaxSubsequenceSum1(const int arr[],int len) {
int MaxSum = 0;
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
int sum = 0;
for (int k = i; k <= j; k++) {
sum += arr[k];
}
MaxSum = max(MaxSum, sum);
}
}
return MaxSum;
}
//暴力优化版本
int MaxSubsequenceSum2(const int arr[], int len) {
int MaxSum = 0;
for (int i = 0; i < len; i++) {
int sum = 0;
for (int j = i; j < len; j++) {
sum += arr[j];
MaxSum = max(MaxSum, sum);
}
}
return MaxSum;
}
//分治
int Max3(int a, int b, int c) {
return max(a, max(b, c));
}
int MaxSubSum(const int arr[], int left, int right) {
int MaxLeftSum = 0, MaxRightSum = 0;
int MaxLeftBorderSum, MaxRightBorderSum;
int mid;
if (left == right) {
if (arr[left] > 0) return arr[left];
else return 0;
}
mid = (left + right) >> 1;
MaxLeftSum = MaxSubSum(arr, left, mid);
MaxRightSum = MaxSubSum(arr, mid + 1, right);
int maxleft = 0; MaxLeftBorderSum = 0;
for (int i = mid; i >= left; i--) {
maxleft += arr[i];
MaxLeftBorderSum = max(MaxLeftBorderSum, maxleft);
}
int maxright = 0; MaxRightBorderSum = 0;
for (int i = mid+1; i <= right; i++) {
maxright += arr[i];
MaxRightBorderSum = max(MaxRightBorderSum, maxright);
}
return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum);
}
int MaxSubsequenceSum3(const int arr[], int len) {
return MaxSubSum(arr, 0, len - 1);
}
//联机算法
int MaxSubsequenceSum4(const int arr[], int len) {
int sum, MaxSum;
sum = MaxSum = 0;
for (int i = 0; i < len; i++) {
sum += arr[i];
if (sum > MaxSum)
MaxSum = sum;
else if (sum < 0)
sum = 0;
}
return MaxSum;
}
int main() {
int arr[] = { 4,-3,5,-2,-1,2,6,-2 };//answer is 11
int ret = MaxSubsequenceSum4(arr, sizeof(arr) / sizeof(arr[0]));
cout << ret << endl;
return 0;
}
最大子序列和
最新推荐文章于 2024-05-07 20:09:02 发布