1
forwap 2011-06-14 14:03:36 +08:00
- -!直接心算出来,不到1分钟(当然这个比较简单)
|
2
darktiny 2011-06-14 14:20:39 +08:00
楼主的bio很有意思
|
3
ssword 2011-06-14 14:31:35 +08:00
这种题目小学水平。建议楼主搜下project euler
|
4
kernel31 2011-06-14 14:42:17 +08:00
没看懂lz的算法,我自己想了一个,首先想像这个数列的前n项和S(n)。SUM(N,M)=S(M)-S(N-1)。要使SUM(N,M)最大,N,M必须满足对任何n<N,S(n)>=S(N-1);对任何n>M,S(n)<=S(M)。这是使SUM(N,M)最大必要条件而非充分条件,可能有不只一对N,M满足上面的条件,只需要找出这些N,M对并选出其中和最大的一对就可以
|
5
CoX 2011-06-14 15:15:25 +08:00
到实际应用的时候,肯定就不是十个数这么简单了
|
6
iugo OP |
7
chloerei 2011-06-14 19:26:36 +08:00
我只懂得穷举
|
8
tioover 2011-06-14 19:59:41 +08:00
《离散数学及其应用》在书架上吃灰的路过
|
9
dementrock 2011-06-15 05:52:30 +08:00 via iPhone
经典的动态规划问题 最大子段和问题
|
10
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即可 如此这般……应该没错吧,擦汗。真的离开这个太久了。 |