测试样例
10
-2 11 -4 13 -5 2 5 15 4 -1
输出
41 1 8
一下给出一种求最大字段和的完整程序
首先输入一个整数n 表示有n个数的序列
然后输入n个数
之后输出n个数的最大字段和是多少,并且输出左右端位置
以下三种解法复杂度分别是O(n^3) O(n^2) O(n)
#include<cstdio>
int a[100];
int max,start,end,n;
int main()
{
freopen("1.txt","r",stdin);
while(scanf("%d",&n)==1)
{
int i,j,k;
max = start = end = 0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
for(j=i;j<n;j++)
{
int sum = 0;
for(k=i;k<=j;k++)
{
sum+=a[k];
}
if(sum>max)
{
start = i;
end = j;
max = sum;
}
}
printf("%d %d %d \n",max,start,end);
}
}
#include<cstdio>
int a[100];
int dp[100];
int max,start,end,n;
int main()
{
freopen("1.txt","r",stdin);
while(scanf("%d",&n)==1)
{
int i,j,sum;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
sum =0;
for(j=i;j<n;j++)
{
sum +=a[j];
{
if(sum>max)
{
max = sum;
start = i;
end = j;
}
}
}
}
printf("%d %d %d\n",max,start,end);
}
return 0;
}
#include<cstdio>
int a[100];
int dp[100];
int n,max,start,end;
int main()
{
freopen("1.txt","r",stdin);
while(scanf("%d",&n)==1)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
max =0;
dp[0]=a[0];
for(i=1;i<n;i++)
{
if(dp[i-1]>0)
{
dp[i]=dp[i-1]+a[i];
}
else
{
dp[i]=a[i];
}
if(dp[i]>max)
{
max = dp[i];
if(dp[i]==a[i])
{
start = i;
end =i;
}
else
{
end = i;
}
}
}
printf("%d %d %d\n",max,start,end);
}
return 0;
}