#include <iostream>
#include <vector>
#include <string>
using namespace std;
int LCS(string X, string Y) {
int m = X.length(), n = Y.length();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// Build the dp table
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (X[i - 1] == Y[j - 1])
dp[i][j] = 1 + dp[i - 1][j - 1];
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
return dp[m][n];
}
int main() {
string str1 = "ABCBDAB";
string str2 = "BDCAB";
cout << "Length of LCS: " << LCS(str1, str2) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBMQ1Moc3RyaW5nIFgsIHN0cmluZyBZKSB7CiAgICBpbnQgbSA9IFgubGVuZ3RoKCksIG4gPSBZLmxlbmd0aCgpOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBkcChtICsgMSwgdmVjdG9yPGludD4obiArIDEsIDApKTsKCiAgICAvLyBCdWlsZCB0aGUgZHAgdGFibGUKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG07ICsraSkgewogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG47ICsraikgewogICAgICAgICAgICBpZiAoWFtpIC0gMV0gPT0gWVtqIC0gMV0pCiAgICAgICAgICAgICAgICBkcFtpXVtqXSA9IDEgKyBkcFtpIC0gMV1baiAtIDFdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBkcFtpXVtqXSA9IG1heChkcFtpIC0gMV1bal0sIGRwW2ldW2ogLSAxXSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBkcFttXVtuXTsKfQoKaW50IG1haW4oKSB7CiAgICBzdHJpbmcgc3RyMSA9ICJBQkNCREFCIjsKICAgIHN0cmluZyBzdHIyID0gIkJEQ0FCIjsKICAgIGNvdXQgPDwgIkxlbmd0aCBvZiBMQ1M6ICIgPDwgTENTKHN0cjEsIHN0cjIpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQo=