最长公共上升子序列(LCIS) 2016.7.14

本文介绍了最长公共上升子序列(LCIS)问题,详细解析了状态转移方程和时间、空间复杂度的优化方法。通过实例展示了优化后的算法如何处理序列变化,并指出在要求打印路径的情况下,二维数组的必要性。
摘要由CSDN通过智能技术生成

参考:http://blog.csdn.net/wall_f/article/details/8279733

定义状态

dp[i][j] 表示序列 a{1, ... , i} 与序列 b{1, ... , j} 的以 b[j] 结尾的 LCIS 的长度


状态转移方程

①、若 a[i] != b[j],dp[i][j] = dp[i-1][j]

②、若 a[i] == b[j],dp[i][j] = max(dp[i-1][k]) + 1 (1 <= k < j && b[k] < b[j])


对于①:

dp[i][j] 是以 b[j]  为结尾的且 a[i] != b[j],所以 a[i] 对 dp[i][j] 没有贡献,必然有 dp[i][j] = dp[i-1][j]

对于②:

已知 a[i] == b[j],我们只要在前面找到一个最长的且结尾小于 b[j]  的 LCIS,然后将 b[j] 接到其后面就可以得到一个以 b[j] 结尾的 LCIS


时间复杂度的优化

可以发现,当 a[i] == b[j] 时,我们需要找到一个 dp[i-1][k] 来取得最优解,且 b[k] < b[j],那么必然有b[k] < a[i]

所以我们可以维护一个 Max  来存储 dp[i-1][k] 的值,只要有 a[i] > b[j] 的地方就去尝试更新这个最大值

也可以维护一个 t 来存储 k 的值


空间复杂度的优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值