题目大意
给定字符串X和Y,可以对字符串进行一下三种操作:
1、删除一个字符
2、插入一个字符
3、替换一个字符
每个操作代价是1,问运用以上三种操作把X变为Y所需的最小步数是多少?
题解
定义dp[i][j]为把X的前i个字符转换为Y的前j个字符所需的最小步数
如果X[i]==Y[j]则dp[i][j]=dp[i-1][j-1]
如果X[i]!=Y[j]则dp[i][j]=min(dp[i-1][j-1]+1,dp[i-1][j]+1,dp[i][j-1]+1)
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXN 1005 char x[MAXN],y[MAXN]; int dp[MAXN][MAXN]; int main() { int n,m; while(~scanf("%d%s",&n,x+1)) { memset(dp,0,sizeof(dp)); scanf("%d%s",&m,y+1); dp[0][0]=0; 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(x[i]==y[j]) dp[i][j]=dp[i-1][j-1]; else { dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1; dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1); } printf("%d ",dp[n][m]); } return 0; }