最大字段和 最暴力的算法就是
int s = 0;//起始位置
int e = 0; //结束位置
int max = 0;
for(int i = 1; i <= n; ++i)
{
for(int j = i; j <= n;++j)
{
int sum = 0;
for(int k = i; k <=j; ++k)
sum += a[k];
if(sum > max)
{
s = i;
e = j;
max = sum;
}
}
}
显然 时间复杂度O(n^3) 可想而知 必然超时 ,
因此优化操作 用一个sum 直接加 这样复杂度变成O(n^2) 但是 对于数据来说 仍会超时
for(int i = 1; i <= n; ++i)
{
int sum = 0;
for(int j = i; j <= n;++j)
{
sum += a[j];
if(sum > max)
{
start = i;
end = j;
max = sum;
}
}
}
这是我们用dp 思想来 dp[i]=max(dp[i],dp[i]+a[i]); 这样 复杂度就是O(n)74
77
for(int i = 1; i <= n; ++i)
{
if(b[i-1]>0)
{
b[i] = b[i-1]+a[i];
}else{
b[i] = a[i];
}
if(b[i]>max)
max = b[i];
}
因此最大字段和就是max
但是 这样 我们却没有记录起始点和终点 我们又可以这样操作
s=e=temp=1;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
sum+=x;
if(sum>max)
{
max=sum;
s=temp;
e=i;
}
if(sum<0)
{
sum=0;
temp=i+1;
}
}