if(i == 0) dp[i][j] = j;
if(j == 0) dp[i][j] = i;
if(s1[i] == s2[j]) dp[i][j] = dp[i-1][j-1];
else dp[i][j] = max{dp[i-1][j] + 1 // 删除 s1[i];
dp[i][j-1] + 1 // 删除 s2[j];
dp[i-1][j-1] + 1// 更改
};
去掉了memset(dp,63,sizeof(dp));
表示跑得飞快。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAXN (4000+4)
char s1[MAXN], s2[MAXN];
int dp[MAXN][MAXN];
#define min(u,v) (u<v?u:v)
int main()
{
scanf("%s", s1+1); scanf("%s", s2+1);
int n = strlen(s1+1), m = strlen(s2+1);
for(int i = 1; i <= n; i ++) dp[i][0] = i;
for(int j = 1; j <= m; j ++) dp[0][j] = j;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
if(s1[i] == s2[j])
dp[i][j] = dp[i-1][j-1];
else dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;
cout << dp[n][m] << endl;
return 0;
}