最长非降子序列问题的动态转移方程没看懂

2014-10-26 21:43:27 +08:00
 spencerqiu


这边 f(i) 直接就等于之前所有结果中的最大结果 +1 了,感觉怪怪的。

比如第九次,加入的是 16 不能把它放进去,这个方程又是个什么意思呢?
2611 次点击
所在节点    问与答
7 条回复
mousepotato
2014-10-26 22:56:16 +08:00
请问lz这本书名,多谢!
spencerqiu
2014-10-26 23:10:30 +08:00
@mousepotato
高中生用的教材,不是那种应付面试的哦。
zhsso
2014-10-26 23:17:25 +08:00
这边 f(i) 直接就等于之前所有结果中的最大结果 +1 了,感觉怪怪的。
这句话错的,有限定条件,应该是等于之前a[i] > (>=?) a[j]的最大结果+1
应付面试的题目也可以提高算法的....
windywinter
2014-10-26 23:20:29 +08:00
转移方程上少写了个条件
zhsso
2014-10-26 23:24:22 +08:00
前面还有个max....其实就是判断加入第i个数后,能达到的最长长度,要么为f(i-1),要么为f(j)+1(i<j && a[i] > a[j])的最大值,哪个大就哪个
llbbzh
2014-10-27 00:49:29 +08:00
建议看看这个问题O(nlgn)的算法
heliumhgy
2014-10-27 01:55:14 +08:00
@spencerqiu 其实说白了就是在一个数组f中第i个元素(f[i])中保存原序列a中前i个元素的最长非降子序列的长度,当扩展到第i+1个元素的时候,只需要在前i个元素中找到符合非降的元素j(符合条件a[j]<=a[i]),那么f[j]+1就是一个非降子序列的长度,就可以赋值给f[i+1],用max选出了最长的那个子序列的长度并存起来就好了,一直搜索下去,f[n]就是解了。。。用另外一个数组你还能知道这个最长的子序列到底是什么。。。
如果看懂了就点个感谢还我金币!!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/141666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX