這道題目曾經困擾我很久,覺得自己的程序應該沒什麼問題卻老是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;
}
}