dp[i][j]=max⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪dp[i−1][j]dp[i][j−1]dp[i−1][j−1]+1if: str[i]==str[j]
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <utility>
#include <numeric>
#include <queue>
using namespace std;
//#define debug_
int func(string str1, string str2)
{
vector<int> tmp(str2.size()+1);
vector<vector<int>> dp(str1.size()+1,tmp);
for (auto i = 1; i <= str1.size();++i)
{
for (auto j = 1; j <= str2.size();++j)
{
dp[i][j] = max(dp[i][j],dp[i][j-1]);
dp[i][j] = max(dp[i][j], dp[i-1][j]);
if (str1[i-1]==str2[j-1])
{
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);
}
else
{
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1]);
}
}
}
return dp[str1.size()][str2.size()];
}
int main()
{
string str1;
string str2;
#ifdef debug_
str1 = "AAACCGTGAGTA";
str2 = "CACCCCTAAGGTACCTT";
#else
cin >> str1;
cin >> str2;
#endif
cout << func(str1, str2) << endl;
return 0;
}