这题一看就想到用dp来做,至于为什么我也不知道。其dp的思想也比较简单,不过自己写的有点复杂了,看了网上的题解才知道自己是那么的弱。
这个是我的代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
int dp[N],s[N],e[N],data[N];
int main()
{
int t,n,k=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&data[i]);
dp[i]=data[i];
s[i]=i,e[i]=i;
}
int ans=dp[1],_s=1,_e=1;
for(int i=2;i<=n;i++)
{
int t=dp[i-1];
for(int j=e[i-1]+1;j<=i;j++)
t+=data[j];
if(t>=dp[i-1]&&t>=dp[i])
{
dp[i]=t;
s[i]=s[i-1];
e[i]=i;
}
if(t<=dp[i-1]&&dp[i]<=t)
{
dp[i]=dp[i-1];
s[i]=s[i-1];
e[i]=e[i-1];
}
if(ans<dp[i])
{
ans=dp[i];
_s=s[i];
_e=e[i];
//printf("_s=%d,_e=%d\n",_s,_e);
}
}
if(k>1)
printf("\n");
printf("Case %d:\n",k++);
printf("%d %d %d\n",ans,_s,_e);
}
return 0;
}
网上别人的代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
int data[N];
int main()
{
int t,n,k=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&data[i]);
int ans=data[0],_max=data[0],_s=0,_e=0,posi=0;
for(int i=1;i<n;i++)
{
if(_max+data[i]<data[i])
{
_max=data[i];
posi=i;
}
else
_max+=data[i];
if(ans<_max)
{
ans=_max;
_s=posi;
_e=i;
}
}
printf("Case %d:\n",k++);
printf("%d %d %d\n",ans,_s+1,_e+1);
if(t)
printf("\n");
}
return 0;
}