说到这个题吧,又想说那句话:难的不会,会的不难。我前前后后大概有10天的时间,只要课余有时间就想想这个题,结果还是没有想出来。结果后来请问了一个学长之后 ,才发现我离这个正确的方法就差那么一步,可也就正是那么关键的一步。总结只有一条:得像高中一样,多做题才能多长见识,才能见到更多的算法!!!! 努力!


04-06-2015

至于题目,大家请前往这儿(http://acm.hdu.edu.cn/showproblem.php?pid=1003)


下面就是代码,若哪儿有不对或是什么建议,请各位观者不吝指出!





#include<iostream>
using namespace std;
int main()
{
int line;//行数
cin >> line;
if(line<=0)//若行数小于等于0,退出
exit(-1);
int t=line;//控制格式
int *p;

for(int i = 0; i < line; i++)// line行,循环line次
{
int n;//元素个数
cin >> n;
if(n<=0)//若元素数小于等于0,退出
exit(-1);
p = new int[n];//为n个元素申请内存

for(int j = 0; j < n; j++)
cin >> p[j]; // 输入元素

int sum = 0; // 保存总和
int Max;//保存当前最大的和
int begpos = 0; //开始位置
int endpos = 0; //结束位置
int temp = 0;//中间变量,存储位置
int k ;
Max = 0;
sum = p[0];

for(k = 0; k < n; k++)// n个元素,循环n次
{
Max += p[k];// 累加当前的元素



if(Max > sum)// 若当前元素的和大于sum
{
begpos = temp;
endpos = k;
sum = Max;// 赋值给sum
if(Max<0)// 即使是Max>sum,Max也有可能是负数,所以加上判断;
{
Max=0; // 如果没有这个判断,比如计算这个数组就会错
temp=k+1; // -6 -4 -3 -7
endpos=k; // 第2个数大于第一个数,所以 sum=-4,但此时Max=-4并没有
} //被赋值为0,加上下一个(-3),Max=-7 < sum=-4;些时Max被赋值为Max=0;
} //这样导致的结果就是之前的sum=-4,没有同Max=-3进行比较,所以会出错
else if(Max < 0)
{
Max = 0;
temp = k + 1; //暂时保存begpos
}
}
delete []p;//释放空间

if(i < t - 1)// 这个 只是为了控制格式的需要,前line-1行之后要有空格,最后一行后不留空行
cout << "Case " << i + 1 << ":" <<endl<< sum << " " << begpos + 1 << " " << endpos + 1 << endl << endl;

else cout << "Case " << i + 1 << ":" <<endl<< sum << " " << begpos + 1 << " " << endpos + 1 << endl;
}

system("pause");
return 0;
}