4、LICS、O(lena * lenb)
设dp[i][j]表示a[]的前i项,以b[]的第j项结尾时,能匹配的最大值。
①、不匹配a[i]这个数,则是dp[i][j] = dp[i – 1][j];
②、匹配a[i]这个数,则需要a[i] == b[j] && b[j] > b[k] 推出 dp[i][j] = max(dp[i – 1][k]) + 1,
这样复杂度需要O(n3),注意到,求解dp的时候,是从dp[i][1….lenb]这样的顺序求解,而且,需要a[i] == b[j]才能算做贡献,因为要LCS嘛!那么可以记录dp[i][1…j – 1]的信息,以a[i]作为基准(因为a[i] == b[j]才能算出贡献,以那个作为基准没所谓),找出前j - 1个数中,满足LIS并且最大的那个,O(1)更新即可。
#include#include #include #include #include #include #define IOS ios::sync_with_stdio(false)using namespace std;#define inf (0x3f3f3f3f)typedef long long int LL;#include #include #include #include #include