#include<iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1010;
int m, n;
char a[N], b[N];
int f[N][N]; // 生命全局全为0保证r1 c1 都是 0
int main()
{
cin >> m >> n;
scanf("%s%s", a + 1, b + 1);
for (int i = 1; i <= m; i++){
for (int j = 1; j <= n; j++){
if (a[i] == b[j])
f[i][j] =f[i - 1][j - 1] + 1;
else
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
}
}
cout << f[m][n];
return 0;
}
STL
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main(void) {
int leng1, leng2;
cin >> leng1 >> leng2;
string str1, str2;
cin >> str1 >> str2;
vector<vector<int>>dp(leng1 + 1, vector<int>(leng2 + 1));
for (int i = 0; i < leng1; ++i) {
for (int j = 0; j < leng2; ++j) {
if (str1[i] == str2[j])
dp[i + 1][j + 1] = dp[i][j] + 1;
else
dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1]);
}
}
cout << dp.back().back() << endl;
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1001;
int f[N][N];
int LCS(string& s1, string& s2) {
int m = s1.size(), n = s2.size();
for (int i = 0; i < m; i++)
f[i][0] = 0;
for (int i = 0; i < n; i++)
f[0][i] = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <=n; j++) {
if (s1[i-1] == s2[j-1])
f[i][j] = f[i - 1][j - 1] + 1;
else
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
}
}
return f[m][n];
}
int main() {
string s;
while (cin >> s) {
int len = s.size();
if (len == 1) {
cout << 1 << endl;
continue;
}
string copy = s;
reverse(copy.begin(), copy.end());
int maxlen = LCS(s, copy);
int res = len - maxlen;
cout << res << endl;
}
return 0;
}