您的位置:首页 > 其它

CI19.7-最大连续子段和

2013-07-20 14:05 281 查看
给定一个整型数组a[],计算最大连续子段和。

例子:

输入:(2, -8, 3, -2, 4, -10)

输出:5 连续子段为(3, -2, 4)

思路:

典型的动态规划问题。对于DP,我们要先找到状态,然后再找到递推关系。定义d[i]为以a[i]结尾的最大连续子段和,那么递推关系为:如果d[i - 1] > 0,d[i] = d[i - 1] + a[i];否则d[i] = a[i]。最后的结果为max{d[i], 0 <= i < n}。我们注意到递推式中d[i]只与d[i - 1]有关系,所以可以将O(n)的空间降为O(1)。

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

int MaxSum(const vector<int>& ivec, bool& check)
{
if (ivec.size() == 0)
{
check = false;
return -1;
}
check = true;
int res = INT_MIN;
int sum = ivec[0];
for (int i = 1; i < ivec.size(); ++i)
{
if (sum > 0)
sum += ivec[i];
else
sum = ivec[i];
if (res < sum)
res = sum;
}
return res;
}

int main()
{
int n, m;
vector<int> ivec;
while (cin >> n)
{
while (n--)
{
cin >> m;
ivec.push_back(m);
}
bool check;
int res = MaxSum(ivec, check);
if (check)
cout << res << endl;
else
cout << "invalid" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: