最大连续子序列问题
dp做法
#include<bits/stdc++.h>
using namespace std;
int a[100020],dp[100020],l[100020],r[100020];
int main()
{
int T,N;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&a[i]);
dp[0]=0;
dp[0]=0,l[0]=1,r[0]=0;
for(int i=1;i<=N;i++)
{
if(dp[i-1]+a[i]>=a[i])
{
dp[i]=dp[i-1]+a[i];
r[i]=r[i-1]+1;
l[i]=l[i-1];
}
else
{
dp[i]=a[i];
l[i]=i;
r[i]=i;
}
}
int ans=INT_MIN;
int L,R;
for(int i=1;i<=N;i++)
{
if(dp[i]>ans)
{
ans=dp[i];
L=l[i];
R=r[i];
}
}
if(kase!=1)
printf("\n");
printf("Case %d:\n",kase);
printf("%d %d %d\n",ans,L,R);
}
return 0;
}
非dp做法
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[100020];
int K,T;
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
scanf("%d",&K);
for(int j=1;j<=K;j++)
scanf("%d",&a[j]);
int s=0,l=1;
int L=1,R=1;
int M=a[1];
for(int j=1;j<=K;j++)
{
s+=a[j];
if(s>M)
{
L=l;
M=s;
R=j;
}
if(s<0)
{
s=0;
l=j+1;
}
}
printf("Case %d:\n",i);
printf("%d %d %d\n",M,L,R);
if(i!=T)
printf("\n");
}
return 0;
}