题目大意:
给你两个字符串A,B,和以下三种操作:
1.删除一个字符
2.插入一个字符
3.把一个字符改变成另一个字符
求使A变成B所需要的最少的操作;
我刚开始的思路是以为求出最长公共子序列,然后对比A,B的长度做加减,不过WA了一发,
后来想,,可以在这三种操作上做文章,
A[i]==B[j]时
dp[i][j]=dp[i-1][j-1];
A[i]!=B[j]时:分三种情况
1.插入字符:dp[i][j]=dp[i-1][j]+1;
2.删除字符:dp[i][j]=dp[i][j-1]+1;
3.替换字符:dp[i][j]=dp[i-1][j-1]+1;
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<vector> 6 #include<algorithm> 7 #include<stack> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 typedef long long ll; 12 #define inf 0x3f3f3f3f; 13 #define F(x,y) for(x=0;x<=y;x++) 14 const int maxn=2e3+5; 15 int dp[maxn][maxn]; 16 int main() 17 { 18 string a,b; 19 while(cin>>a>>b){ 20 memset(dp,0,sizeof(dp)); 21 int i,j; 22 int lena=a.length(),lenb=b.length(); 23 F(i,lena) dp[i][0]=i; 24 F(i,lenb) dp[0][i]=i; 25 F(i,lena) 26 F(j,lenb) 27 if(a[i-1]==b[j-1]) 28 dp[i][j]=dp[i-1][j-1]; 29 else 30 dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1; 31 printf("%d\n",dp[lena][lenb]); 32 } 33 return 0; 34 }
这题代码稍微一改,就是 不连续的最长公共子序列http://acm.hdu.edu.cn/showproblem.php?pid=1159;