参考: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 的值
空间复杂度的优化