RT
题目描述
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符;
!皆为小写字母!
输入输出格式
输入格式:
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。
输出格式:
只有一个正整数,为最少字符操作次数。
输入输出样例
输入样例 输出样例
sfdqxbw 4
gfdgw
看见求最优解,首先想到dp;
然后发现好像和最长公共子序列有关;
理性分析
loading......
令dp[i][j]为a1...ai和b1...bj的匹配最小改动长度
则如果ai==bj
dp[i][jj=dp[i-1][j-1];
如果不匹配
则可以选ai或bj或 (我全都要!!!)
dp[i][j]=min( min(dp[i][j-1],dp[i-1][j]) ,dp[i-1][j-1]) +1;
好了;
别忘了赋初值;
骚代码
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; char a[2010],b[2010]; int a1[2010],b1[2010]; int lena,lenb; int dp[2010][2010]; int main() { freopen("in","r",stdin); scanf("%s",a); printf("%s\n",a); scanf("%s",b); printf("%s\n",b); lena=strlen(a); lenb=strlen(b); for(int i=1;i<=lena;++i) dp[i][0]=i; for(int i=1;i<=lenb;++i) dp[0][i]=i; for(int i=1;i<=lena;++i) { for(int j=1;j<=lenb;++j) { if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]; continue; } dp[i][j]=min(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1; } } printf("%d",dp[lena][lenb]); }