本题的意思和我们学校OJ上的编辑距离是一样的,只不过是一个中文,一个英文罢了。
有3中操作,删除,插入,替换。属于字符串匹配的DP问题。
如果a[i]==b[j],dp[i][j]=dp[i-1][j-1];
否则的话,状态转移方程就是dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+1));
另外写的时候一定要注意初始化的问题。
-------------------------------------------------
#include <iostream> #include <cstring> #include <cmath> using namespace std; int dp[1000+10][1000+10]; int main() { string a,b; int i,j,al,bl,ll; int t; while(cin>>al>>a>>bl>>b) { ll=max(al,bl); for(i=0; i<=al; ++i) for(j=0; j<=bl; ++j) dp[i][j]=0; for(i=1; i<=al; ++i) dp[i][0]=dp[i-1][0]+1; for(j=1; j<=bl; ++j) dp[0][j]=dp[0][j-1]+1; for(i=1; i<=al; ++i) for(j=1; j<=bl; ++j) { if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]; else dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+1)); } cout<<dp[al][bl]<<endl; } return 0; }