这篇文章就作为线性dp的第一篇文章吧。
结合LIS与LCS,定义f(i,j)为a1~ai与b1~bj可以构成的以bj为结尾的LCIS的长度。
设a0 = b0 = -∞,方便处理。则当ai ≠ bj时,f(i,j)= f(i - 1,j);
当ai = bj时,f(i,j) = max {f(i - 1,k)} + 1,其中 j∈[0, j),且bk < bj(= ai)
复杂度不难计算是O(nm²)
但是仔细一想,发现i是第一重循环变量,即ai是不变的,我们做每一个j的时候,对于后面的j+1~m,j就是k的一种选择。而我们要最大值,这不正可以一边做一边更新最大值吗?这样我们就可以不用枚举k。O(nm)。
内存优化就不说了,常规滚动数组。