若最大子段和记:b[j]=max(a[i]+a[i+1]+..+a[j]),其中1<=i<=j,并且1<=j<=n。则所求的最大子段和为max b[j],1<=j<=n。
int sum=0, b=0,start=0,end=0,n=a.length;
for(int i=1;i<=n;i++)
{
if(b>0)
b=b+a[i-1];
else
{
b=a[i-1];
start=i;
}
if(b>sum)
{
sum=b;
end=i;
}
}
System.out.println("the max value:");
System.out.println("start="+start+" end="+end);
}
由b[j]的定义可易知,当b[j-1]>0时b[j]=b[j-1]+a[j],否则b[j]=a[j]。故b[j]的动态规划递归式为:
b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n。
b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n。
实现代码:
public static void maxsub(int []a)
{int sum=0, b=0,start=0,end=0,n=a.length;
for(int i=1;i<=n;i++)
{
if(b>0)
b=b+a[i-1];
else
{
b=a[i-1];
start=i;
}
if(b>sum)
{
sum=b;
end=i;
}
}
System.out.println("the max value:");
System.out.println("start="+start+" end="+end);
}