最大子序列求和_找一列数的最大子序列和的四种方法(C语言实现)

找一列数的最大序列

-6 2 3 7 8 -1 -3 1

1.

最直接的想法:

找出所有的序列后求和

/

* * 文件名称:cacuMaxSequenceSum.h

* 摘 要:计算一列数中最大序列的和,并运用格式化代码编写程序

* * 当前版本:1.0

* 作 者:ER

* 完成日期:2011年3月14日

*/

#include

using namespace std;

int main(void)

{//配对的大括号尽量写在同一列上,是程序易于阅读左右都

int array[8] = {-6, 4, -3, 7, 8, -1, -2,

1};//右大括号向后紧跟,逗号和做大括号向前紧跟,赋值操作符留空格

int i, j, k;//应该一行做一件事情,i,j,k循环变量

int maxSum = 0;//尽量在声明变量时初始化变量,避免因未初始化产生的问题

int sum = 0;//在声明变量块后留下空行

for (i=0; i<8;

i++)//for和if等关键字后可以加一个空格,这样可以突出关键字,这使在非IDE环境下的代码更清楚。在代码稍长的情况下省略空格

{

for (j=i; j<8;

j++)

{

sum =

0;

for (k=i;

k<=j; k++)

{

sum+=array[k];

}

if (maxSum

< sum)

{

maxSum

= sum;

}

}

}//在主要计算过程后留下空行

cout << "maxSum: "

<< maxSum

<< endl;//在结果输出完成后留下空行

return 0;

}

2.

减少一个循环

/

* * 文件名称:cacuMaxSequenceSum.h

* 摘 要:计算一列数中最大序列的和,并运用格式化代码编写程序

* * 当前版本:2.0

* 作 者:ER

* 完成日期:2011年3月14日

* 修改内容:去掉没有必要的第三个循环

*

* 修改版本:1.0

* 作 者:ER

* 完成日期:2011年3月14日

*/

#include

using namespace std;

int main(void)

{

int array[8] = {-6, 4, -3, 7, 8, -1, -2,

1};

int i, j;

int maxSum = 0;

int sum = 0;

for (i=0; i<8; i++)

{

maxSum = 0;

for (j=i; j<8;

j++)

{

sum +=

array[j];

if (maxSum

< sum)

{

maxSum

= sum;

}

}

}

cout << "maxSum: "

<< maxSum

<

return 0;

}

3.

将原序列分成前后两部分,那么最大序列要么最前部分,要么在后面的那一部分,要么横跨两个部分。

比较这三个,大的那个就是最大序列。

/

* * 文件名称:cacuMaxSequenceSum.h

* 摘 要:计算一列数中最大序列的和,并运用格式化代码编写程序

* * 当前版本:3.0

* 作 者:ER

* 完成日期:2011年3月14日

* 修改内容:利用递归,折半的方法找子序列的的最大值

*

* 修改版本:2.0

* 作 者:ER

* 完成日期:2011年3月14日

*/

#include

using namespace std;

int ThreeMax(int a,int b,int c);

int MaxSubSum(const int* A, int left, int right);

int main(void)

{

int array[8] = {-6, 4, -3, 7, 8, -1, -2,

1};

int maxSum = 0;

maxSum = MaxSubSum(array, 0 ,7);

cout << "maxSum:

" << maxSum

<

return 0;

}

int ThreeMax(int a,int b,int c)

{

if(a>=b&&a>=c)

{

return a;

}

else

if(b>=a&&b>=c)

{

return b;

}

else

if(c>=a&&c>=b)

{

return c;

}

else

{

return 0;

}

}

int MaxSubSum(const int* A, int left, int right)

{

if(left == right){

if (A[left] <

0)

{

return

0;

}

else

{

return

A[left];

}

}

int maxLeftSum = 0;

int maxRightSum = 0;

int maxLeftMidSum = 0;

int maxRightMidSum = 0;

int maxMidSum = 0;

int center = (int)(left + right) / 2;

int leftMidSum = 0;

int rightMidSum = 0;

int i;

maxLeftSum = MaxSubSum(A, left, center);

maxRightSum = MaxSubSum(A, center + 1,

right);

for (i=center; i>=left;

i--)

{

leftMidSum += A[i];

if (maxLeftMidSum

< leftMidSum)

{

maxLeftMidSum

= leftMidSum;

}

}

for(i=center+1 ; i<=right;

i++)

{

rightMidSum += A[i];

if( maxRightMidSum

< rightMidSum)

{

maxRightMidSum

= rightMidSum;

}

}

maxMidSum = maxLeftMidSum + maxRightMidSum;

return ThreeMax(maxLeftSum, maxRightSum,

maxMidSum);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值