您的位置:首页 > 编程语言 > C语言/C++

算法最大字段和

2014-10-02 13:22 375 查看
实现最大字段和算法,分治法 C++实现.。

#include <iostream>
using namespace std;

int Max(int array[], int left, int right);

int main(int argc, const char * argv[]) {
int array[] = {-20, 11, -4, 13, -5, -2}; // 最大子段和为20
int sum = Max(array, 0, 5);
cout<<sum<<endl;
return 0;
}

int Max(int array[], int left, int right) {
int sum;
int center;
int leftSum; // 分治的左边值的和
int rightSum; // 分治的右边边值的和
int middeLeftSum = 0; // 中点左边和
int middeRightSum = 0; // 中点右边和
int tempmiddeLeftSum = 0; // 辅助求中点左边最大值,下同。
int tempmiddeRightSum = 0;
// 求出中点索引
center = (left + right) / 2;

if (left == right) {
return array[left];
}

leftSum = Max(array, left, center);
rightSum = Max(array, center + 1, right);

for (int i = center; i >= left; i--) {
tempmiddeLeftSum += array[i];
if (middeLeftSum <= tempmiddeLeftSum) {
middeLeftSum = tempmiddeLeftSum;
}

}

for (int i = center + 1; i <= right; i++) {
tempmiddeRightSum += array[i];
if (middeRightSum <= tempmiddeRightSum) {
middeRightSum = tempmiddeRightSum;
}

}

int middleSum = middeLeftSum + middeRightSum;

sum = leftSum >= rightSum? leftSum : rightSum;

sum = middleSum > sum? middleSum : sum;

return sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 算法