poj 3356 AGTC

题意:

    给定两个字符串,求经过多少次的增删改操作可使两个字符串相同。与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,  0sizeof(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 ;
}

你可能感兴趣的:(poj)