您的位置:首页 > 其它

HDOJ 1003题解

2015-06-03 15:57 459 查看

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. 最大子列和问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDOJ 算法