LIS 问题中怎样定义子状态
这样的话,状态转移方程就不太能设计了。
如果 f(i) 可以从 f(j) + 1 转移(j \u0026lt; i,a \u0026lt; a),那么 f(5) = 4,结果就不对了。
如果 f(i) 不能从 f(j) + 1 转移(j \u0026lt; i,a \u0026lt; a),那么 f(2) 也不会等于 2。
■网友
简单地说,如果单纯只定义 f 为前 i 个,那么转移的时候便不知道上次选取的元素大小,即无法判断该子序列是否为 LIS
■网友
【LIS 问题中怎样定义子状态】 因为状态里必须包含足够的信息来保证你能够进行转移。
这样设计状态也可以,只是要再放一些别的信息进去,比如说dp表示前i个元素中结尾值为j的所有递增子序列的最长长度,但这样是n^2的。注意到从dp转移到dp时,第二维实际上只有a这个位置变了,所以我们可以直接在dp上修改得到dp,再用一种支持前缀查询最大值和单点修改的数据结构维护它,比如线段树。这实际上就是传统的线段树求LIS的那个算法。
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采
- 怎样评价类似前橙会、百老汇、南极圈这样类型的离职帮抱团,对企业的积极意义和消极意义