码迷,mamicode.com
首页 > 其他好文 > 详细

最小编辑代价

时间:2016-05-02 18:27:26      阅读:386      评论:0      收藏:0      [点我收藏+]

标签:

最小编辑代价问题:

对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。

给定两个字符串AB,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。

测试样例:
"abc",3,"adc",3,5,3,100
返回:8

问题分析:看到这道题,首先想到的是编辑距离问题,可以说是有异曲同工之处,但需要注意的是要将增删改的代价考虑进去。

注意:(1)增删的操作只能是在A串上操作,增加B[j]:h[i][j] = h[i][j-1]+c0;删除A[i]:h[i][j] = h[i-1][j]+c1;

(2)修改的操作要比较代价大小,因为删除一次再插入一次也可以看做是修改操作。

程序实现:

 1 class MinCost {
 2 public:
 3     int min2(int a,int b){
 4         return a<b?a:b;
 5     }
 6     int min3(int a,int b,int c){
 7         return min2(a,b)<c?min2(a,b):c;
 8     }
 9     int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) {
10         // write code here
11         int h[n+1][m+1];
12         h[0][0] = 0;
13         for(int i=1;i<=n;i++)
14             h[i][0] = i * c1;
15         for(int j=1;j<=m;j++)
16             h[0][j] = j * c0;
17         for(int i=1;i<=n;i++){
18             for(int j=1;j<=m;j++){
19                 if(A[i-1] == B[j-1])
20                     h[i][j] = h[i-1][j-1];
21                 else{
22                     int Delete_cost = h[i-1][j] + c1;//删除A[i]
23                     int Insert_cost = h[i][j-1] + c0;//插入B[j]
24                     int Modify_cost = h[i-1][j-1] + min2(c0+c1,c2);//修改A[i]为B[j]
25                     h[i][j] = min3(Delete_cost,Insert_cost,Modify_cost);
26                 }
27             }
28         }
29         return h[n][m];
30     }
31 };

转载请注明出处:

C++博客园:godfrey_88

http://www.cnblogs.com/gaobaoru-articles/

最小编辑代价

标签:

原文地址:http://www.cnblogs.com/gaobaoru-articles/p/5452680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!