这道题目曾经困扰我很久,觉得自己的程序应该没什么问题却老是WA,测试用例全部能通过,今天重新写了一遍 另外对全负数的情况进行了专门的处理 一次就AC了 开始有点困惑,现在一看前面的逻辑还真有点荒唐
AC代码:
#include<iostream>
using namespace std;
int num[10000];
int spacial(int n)
{
int tag=1;
for(int i=0;i<n;i++)
if(num[i]>=0)
{
tag=0;
break;
}
return tag;
}
void find_max(int &low,int &high,int &max,int n)
{
int from,sum;
from=sum=0;
for(int i=0;i<n;i++)
{
if(num[i]+sum>max){max=sum+=num[i],low=from,high=i;}
else if(num[i]+sum>0){sum+=num[i];}
else {sum=0;from=i+1;}
}
}
int main()
{
int n;
while(cin>>n&&n)
{
for(int i=0;i<n;i++)cin>>num[i];
if(spacial(n))cout<<0<<" "<<num[0]<<" "<<num[n-1]<<endl;
else
{
int low,high,max;
low=high=0;max=-1;
find_max(low,high,max,n);
cout<<max<<" "<<num[low]<<" "<<num[high]<<endl;
}
}
return 0;
}
经典dp题目,思路还是蛮自然的, 这种状态转换不需要特别的知识直观很容易想到,看看以前的错误版本还是没有很好地处理全负数的情况,此时返回的maxnum肯定是负数,也只有全负数的情况返回一个负数,直接分类处理输出就ok了
不过干脆 单独处理这种情况更清晰
下面贴出一个错误版本
#include <iostream>
using namespace std;
int number[10000];
int main()
{
int n,num;
while (cin>>n&&n)
{
int sum=0,MaxSum=-100000000,start,end,from,to;
for (int i=1;i<=n;i++)
{
cin>>num;
number[i]=num;
}
from=number[1];
for (int j=1;j<=n;j++)
{
sum+=number[j];
to=number[j];
if (sum>MaxSum)
{
MaxSum=sum;
start=from;
end=to;
}
if (sum<=0)
{
sum=0;
if (j<n)from=number[j+1];
}
// if (MaxSum<0)//元素全负
// {
// }
}
cout<<MaxSum<<" "<<start<<" "<<end<<endl;
}
}