问题:给定n个整数(可能但不全为负)a1,a2,…,an, 求i,j,使ai到aj的和最大。
最简单的是3重循环:2重遍历,1重求和。时间复杂度:O(n3)
int MaxSum(int n,int a[],int &besti,int &bestj)
{
int i,j,sum=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
int thissum=0;
for(int k=i;k<=j;k++)
{
thissum+=a[j];
if(thissum>sum)
{
sum=thissum;
besti=i;
bestj=j;
}
}
}
return sum;
}
改进方法之一:可以通过sum(i:j-1)+a(j)来求sum(i:j),时间复杂度:O(n2)
int MaxSum(int n,int a[],int &besti,int &bestj)
{
int sum=0;
for(int i=1;i<=n;i++)
{
int thissum=0;
for(int j=i;j<=n;j++)
{
thissum+=a[j];
if(thissum>sum)
{
sum=thissum;
besti=i;
bestj=j;
}
}
}
return sum;
}
改进方法之二:改进方法之三:动态规划法!
记b[j]=max{sum(i:j) , 1≤i≤j}, 则max{b[k],1 ≤ k ≤ n}就是ms(1,n),即所求的全局最大和。1<=j<=n
int MaxSum(int n, int a[])
{
int sum = 0, b = 0;
for(int i=1; i <= n; ++i)
{
if ( b > 0 )
b += a[i];
else
b = a[i];
if ( b > sum )
sum = b;
}
return sum;
}
b[j]=max( b[j-1]+a[j], a[j] ),