找一列数的最大序列
-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);
}