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

最大子序列和问题的解——C++实现;

2016-03-31 00:00 435 查看
摘要: 给定整数A1,A2,...,An,求子序列的最大值。
此程序经visual studio 2013运行无误。
此程序的运行时间为O(N)。



#include <vector>
#include <iostream>
using namespace std;

//线性算法
int maxSubSum1(const vector<int>& a)
{
int maxSum, thisSum, i = 0;
if (a[0] < 0)
{
maxSum = a[0];
i++;
while (i < a.size())
{
if (a[i] < 0)
{
maxSum = (maxSum > a[i] ? maxSum : a[i]);
i++;
}
else
break;
}
}
if (i < a.size())
{
maxSum = a[i];
thisSum = a[i];
i++;
while (i < a.size())
{
if (a[i] > 0)
{
if (thisSum > 0)
{
thisSum += a[i];
maxSum = (maxSum > thisSum ? maxSum : thisSum);
i++;
}
else
{
thisSum = a[i];
maxSum = (maxSum > thisSum ? maxSum : thisSum);
i++;
}
}
else
{
if (thisSum > 0)
{
if (thisSum + a[i] < 0)
{
thisSum = a[i];
i++;
}
else
{
thisSum += a[i];
i++;
}
}
else
{
thisSum += a[i];
i++;
}
}
}
return maxSum;
}
else
{
return maxSum;
}

}

//穷举算法 时间复杂度为N的平方
int maxSubSum2(const vector<int>& a)
{
int maxSum = a[0], thisSum;
for (int i = 0; i < a.size(); i++)
{
thisSum = 0;
for (int j = i; j < a.size(); j++)
{
thisSum += a[j];
maxSum = (maxSum > thisSum ? maxSum : thisSum);
}
}
return maxSum;
}

//验证函数
int main()
{

vector<int> a = { 4, -3, 5, -2, -1, 2, 6, -2};//放入任意int数据
cout << maxSubSum1(a) << endl
<< maxSubSum2(a) << endl;
cin.get();
return 0;
}


运行结果为

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