Problem Description:
题目大意就是给出了两个字符串x,y.并且规定可以通过delete, insert, change 三种操作修改字符串,问最少经过多少步操作可以将串x 修改成y.
设dp[i][j]表示x串前i位和y串前j位需要的最少操作数。
分三种情况:
situation 1: dp[i][j]=dp[i-1][j-1]+(x[i]==y[j]?0:1) 若是最后两个串的最后一个元素相等,则不需操作,否则使用一步change;
situation 2: dp[i][j]=dp[i-1][j]+1. 若是x串的前(i-1)位和y串的前j位相等,则使用一步delete, 删除y[j];
situation 3: dp[i][j]=dp[i][j-1]+1.若是x串的前i位和y串的前(j-1)位相等,则使用一步insert, 删除x[i];
最终dp[i][j] = min(situation 1,situation 2,situation 3 ).
Code:
#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 1005
char x[MAXN];
char y[MAXN];
int dp[MAXN][MAXN];
int min(int a, int b,int c)
{
int temp = a<b?a:b;
return c<temp?c:temp;
}
int main()
{
int lengthx,lengthy;
while(cin>>lengthy>>y)
{
cin>>lengthx>>x;
dp[0][0] = 0;
for(int i=1;i<=lengthx;i++) dp[i][0]=i;
for(int j=1;j<=lengthy;j++) dp[0][j]=j;
for(int i=1;i<=lengthx;i++)
for(int j=1;j<=lengthy;j++) dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+(x[i-1]==y[j-1]?0:1));
cout<<dp[lengthx][lengthy]<<endl;
}
return 0;
}