题意:
给定两个字符串,求经过多少次的增删改操作可使两个字符串相同。与poj2192相似,用dp[n]记录使str1前n个字符与str2前m个字符相同的最少操作数。每次的判断都有三种情况,即str1前i个字符str2前j-1个字符,str1前i-1个字符str2前j个字符,str1前i-1个字符str2前j-1个字符。取三种情况经过本次操作后的最小值即可。代码:
#include<iostream>
#include <cstring>
using namespace std ;
int min(int a, int b, int c){
int m = 1000000 ;
if(a<m) m = a ;
if(b<m) m = b ;
if(c<m) m = c ;
return m ;
}
int main(){
int n, m ;
char str1[1010], str2[1010] ;
int dp[1010][1010] ;
int i, j ;
while(cin >> n >> str1 >> m >> str2 ){
memset(dp, 0, sizeof(dp)) ;
for(i=0; i<=n; i++)
dp[i][0] = i ;
for(i=0; i<=m; i++)
dp[0][i] = i ;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(str1[i-1]==str2[j-1])
dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]) ;
else
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1 ;
cout << dp[n] << endl ;}
return 0 ;
}