我已经WA了七遍了…依旧没有找到问题!
#include<iostream>
using namespace std;
#include<algorithm>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
int c;
for(c=1;c<=t;c++)
{
printf("Case %d:\n",c);
int n;
scanf("%d",&n);
int num[100005];
int i;
for(i=0;i<n;i++)
scanf("%d",&num[i]);
int dp[100005];
memset(dp,0,sizeof(dp));
int start,end;
start=1;
int ans=-99999999;
dp[0]=num[0];
for(i=1;i<n;i++)
{
if(dp[i-1]+num[i]>=num[i])
{
dp[i]=dp[i-1]+num[i];
if(dp[i]>ans)
{
ans=dp[i];
end=i+1;
}
}
else
{
dp[i]=num[i];
if(dp[i]>ans)
{
ans=dp[i];
start=i+1;
end=i+1;
}
}
}
printf("%d %d %d\n",ans,start,end);
}
return 0;
}
终于A了!虽然我还是没有找到问题…
#include<iostream>
using namespace std;
#include<algorithm>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
int c;
for(c=1;c<=t;c++)
{
printf("Case %d:\n",c);
int n;
scanf("%d",&n);
int num[100005];
int i;
for(i=0;i<n;i++)
scanf("%d",&num[i]);
int dp[100005];
memset(dp,0,sizeof(dp));
int start,end;
start=1;
end=1;
int ans=num[0];
dp[0]=num[0];
int flag=1;
for(i=1;i<n;i++)
{
if(dp[i-1]+num[i]>=num[i])
dp[i]=dp[i-1]+num[i];
else
{
dp[i]=num[i];
flag=i+1;
}
//这个if-else实现的就是dp的过程,因为else的情况起点就变了,所以多了一个变量flag来记录这个变化。
if(dp[i]>ans)
{
ans=dp[i];
end=i+1;
start=flag;
}
//统一更新max跟start、end
}
printf("%d %d %d\n",ans,start,end);
c==t?printf(""):printf("\n");
}
return 0;
}
嗯,这个差不多可以说是最长连续子序列和实现的最清晰的代码版本了!