HDOJ 1003题解
/*
*author:chenhas
*date:2015.06.03
*problem:HDOJ 1003 Max Sum
*/
#include<iostream>
using namespace std;
int MaxSubSum(int *data, int dataNum, int &beg, int &end)
{
int thisSum = 0, maxSum = -1001;
for(int i = 0; i < dataNum; ++i)
{
thisSum += data[i];
if(thisSum > maxSum)
{
// cout << maxSum << " " << i + 1 << endl;
end = i + 1;
maxSum = thisSum;
}
if(thisSum < 0)
{
thisSum = 0;
}
}
thisSum = 0;
if(maxSum != 0)
{
for(int i = end - 1; i >= 0; --i)
{
thisSum += data[i];
if(thisSum == maxSum)
{
beg = i + 1;
}
}
}
else
{
for(int i = 0; i < dataNum; ++i)
{
if(data[i] == 0)
{
beg = i + 1;
end = i + 1;
}
}
}
return maxSum;
}
int main()
{
int caseNum = 0;
int dataNum = 0;
int *data;
cin >> caseNum;
for(int i = 0; i < caseNum; ++i)
{
cin >> dataNum;
data = new int[dataNum];
for(int j = 0; j < dataNum; ++j)
{
cin >> data[j];
}
int beg = 1, end = dataNum;
int maxSum = MaxSubSum(data, dataNum, beg, end);
if(i != caseNum - 1)
{
cout << "Case " << i + 1 << ":" << endl;
cout << maxSum << " " << beg << " " << end << endl << endl;
}
else
{
cout << "Case " << i + 1 << ":" << endl;
cout << maxSum << " " << beg << " " << end << endl;
}
}
system("pause");
return 0;
}
提交代码后一直显示WA,后来才知道错误原因,刚开始写成maxSum = data[0]
,所以这样的数据就过不了,如 5 8 -1 -2 -3 -4
,改成max = -1001
就可以解决了,因为题目说数字范围是-1000~1000,这道题的解法思路是参考陈越姥姥的mooc数据结构课上的在线处理算法。
与本题类似的题型是 Maximum Subsequence Sum (25)
和01-复杂度1. 最大子列和问题