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即可 如此这般……应该没错吧,擦汗。真的离开这个太久了。 |