symons

___________每一天都是幸福的!!

  博客园  ::  :: 新随笔  ::  :: 订阅 订阅  :: 管理

本题的意思和我们学校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;
}

 

posted on 2012-10-22 01:14  symons  阅读(186)  评论(0编辑  收藏  举报