题目来自编程之美
题目
举例:
(1)数组A[6] = {1,-2,3,4,-3,5}; 输出最大和为:11
(2)数组A[6] = {1,-2,3,4,-6,-2}; 输出最大和为:7
(3)数组A[6] = {1,-10,1,2,3,2}; 输出最大和为:9
(4)数组A[6] = {1,2,3,4,5,6}; 输出最大和为:21
(5)数组A[6] = {-1,-2,-3,-4,-5,-6};输出最大和为:-1
思路
代码:
(1)求最大和
#include <iostream>
#include <assert.h>
using namespace std;
int MaxSubSum(int nArr[],int nLen)
{
assert(nArr && nLen > 0);
int nMaxSum = nArr[0];
int nLastMaxSum = nArr[0];
//计算普通数组最大子序列和
for (int i = 1;i < nLen;i++)
{
if (nLastMaxSum < 0)
{
nLastMaxSum = nArr[i];
}
else
{
nLastMaxSum += nArr[i];
}
nMaxSum = max(nMaxSum,nLastMaxSum);
}
//计算普通数组最小子序列和 以及 所有元素之和
int nMinSum = nArr[0];
int nLastMinSum = nArr[0];
int nSum = nArr[0];
for (int i = 1;i < nLen;i++)
{
nSum += nArr[i];
if (nLastMinSum > 0)
{
nLastMinSum = nArr[i];
}
else
{
nLastMinSum += nArr[i];
}
nMinSum = min(nMinSum,nLastMinSum);
}
//比较两部分和,去最大值
if (nMinSum == nSum)//序列全为负数,此时nSum - nMinSum = 0,但是和最大值的数为绝对值最大的负数
{
return nMaxSum;
}
else
{
return max(nMaxSum,nSum - nMinSum);
}
}
int main()
{
int nLen = 6;
//int nArr[6] = {1,-2,3,4,-3,5};// 11
//int nArr[6] = {1,-2,3,4,-6,-2}; // 7
//int nArr[6] = {1,-10,1,2,3,2}; // 9
//int nArr[6] = {1,2,3,4,5,6}; // 21
int nArr[6] = {-1,-2,-3,-4,-5,-6}; // -1
cout<< MaxSubSum(nArr,nLen)<<endl;
system("pause");
return 1;
}
(2)求最大和 以及 序列区间
#include <iostream>
#include <assert.h>
using namespace std;
int MaxSubSum(int nArr[],int nLen)
{
assert(nArr && nLen > 0);
int nMaxSum = nArr[0];
int nLastMaxSum = nArr[0];
int nCurStartOrd = 0;
int nStartOrd = 0;
int nEndOrd = 0;
//计算普通数组最大子序列和
for (int i = 1;i < nLen;i++)
{
if (nLastMaxSum < 0)
{
nLastMaxSum = nArr[i];
nCurStartOrd = i;
}
else
{
nLastMaxSum += nArr[i];
}
if (nMaxSum < nLastMaxSum)
{
nMaxSum = nLastMaxSum;
nStartOrd = nCurStartOrd;
nEndOrd = i;
}
}
//计算普通数组最小子序列和 以及 所有元素之和
int nMinSum = nArr[0];
int nLastMinSum = nArr[0];
int nSum = nArr[0];
int nCurStartRing = 0;
int nStartRing = 0;
int nEndRing = 0;
for (int i = 1;i < nLen;i++)
{
nSum += nArr[i];
if (nLastMinSum > 0)
{
nLastMinSum = nArr[i];
nCurStartRing = i;
}
else
{
nLastMinSum += nArr[i];
}
if (nMinSum > nLastMinSum)
{
nMinSum = nLastMinSum;
nStartRing = nCurStartRing;
nEndRing = i;
}
}
//比较两部分和,去最大值
if (nMinSum == nSum)//序列全为负数,此时nSum - nMinSum = 0,但是和最大值的数为绝对值最大的负数
{
cout<<"区间: "<<nStartOrd<<" - "<<nEndOrd<<endl;
return nMaxSum;
}
else
{
if (nMaxSum > nSum - nMinSum)
{
cout<<"区间: "<<nStartOrd<<" - "<<nEndOrd<<endl;
return nMaxSum;
}
else
{
cout<<"区间: "<<(nEndRing + 1) % nLen<<" - "<<(nStartRing - 1 + nLen) % nLen <<endl;
return nSum - nMinSum;
}
}
}
int main()
{
int nLen = 6;
int nArr[6] = {1,-2,3,4,-3,5};// 11
//int nArr[6] = {1,-2,3,4,-6,-2}; // 7
//int nArr[6] = {1,-10,1,2,3,2}; // 9
//int nArr[6] = {1,2,3,4,5,6}; // 21
//int nArr[6] = {-1,-2,-3,-4,-5,-6}; // -1
cout<< MaxSubSum(nArr,nLen)<<endl;
system("pause");
return 1;
}