cmonday
2011-06-15 08:44:56 +08:00
算法!上了大学之后就没搞过算法了,都快忘完了……
LZ的算法好纠结,感觉效率很低的样子,我理一下这个题……
用A[n]表示前n个数的集合,a[n]表示第n个数,也就是说:
A[n]={a[1],a[2],...,a[n]}
那么A[n]的最大子段一定是A[1],A[2],...,A[n-1],A[n]的最大子段中间的一个
唔,上面那句话是一句彻头彻尾的废话
由于A[1],A[2],...,A[n-1],A[n]都是A[n]的前接子段(以a[1]开头),那么
A[n]的最大子段一定是A[1],A[2],...,A[n-1],A[n]的最大后接子段中间的一个
用b[n]来表示A[n]的最大后接子段,那么
如果(b[n-1]>0),则b[n]=b[n-1]+a[n]
如果(b[n-1]<0),则b[n]=a[n]
如果(b[n-1]==0),则上面的两个式子的值相等,也就是说,此题也许有多个最优解
按照上述思路,先算b[1],再依此计算b[2],b[3],...,b[n],并在过程中记录最大的子段及其对应的M,N即可
如此这般……应该没错吧,擦汗。真的离开这个太久了。