#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 5050;
const int maxl = 55;
const int INF = 0x3f3f3f3f;
int T, n, m, dp[maxn][maxl];
char str1[maxn], str2[maxl];
bool judge(int mid)
{
memset(dp, INF, sizeof(dp));
dp[0][0] = 0;
for (int i = 0; i <= n; i++)
{
if (dp[i][m] <= mid)
dp[i][0] = 0;
for (int j = 0; j <= m; j++)
{
dp[i + 1][j + 1] = min(dp[i + 1][j + 1], dp[i][j] + (str1[i + 1] != str2[j + 1]));
dp[i][j + 1] = min(dp[i][j + 1], dp[i][j] + 1);
dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + 1);
}
}
return dp[n][m] <= mid;
}
int main(int argc, char const *argv[])
{
scanf("%d", &T);
while (T--)
{
scanf("%s%s", str2 + 1, str1 + 1);
n = strlen(str1 + 1), m = strlen(str2 + 1);
int L = 0, R = m, mid;
while (L < R)
{
mid = (L + R) / 2;
if (judge(mid)) R = mid;
else L = mid + 1;
}
printf("%d\n", L);
}
return 0;
}
常见dp,用二分降低时间复杂度,当dp[i][m]<mid 分段更有利,令dp[i][0] = 0;