Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97498
  • 博文数量: 21
  • 博客积分: 145
  • 博客等级: 入伍新兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-22 17:37
文章分类

全部博文(21)

文章存档

2013年(16)

2012年(5)

我的朋友

分类: C/C++

2013-03-20 15:31:48

求最小编辑距离。
具体请看

一道典型的DP题目,思路还是蛮简单的。
考虑长度为i和j的子串最优编辑距离,可以分情况讨论一下。
1)经过删除操作得来,那么开销就是cost[i-1][j] + 1,其中cost[i-1][j]表示i-1和j长度的子串之间的最小编辑距离,如果不是最小,我们可以替换成最小的。
2)经过插入操作得到的,那么开销就是cost[i][j-1]+1。
3)直接copy(没有开销)或者替换(开销为1)
    1. 直接copy,要求 x[i] == y[j],那么开销为cost[i-1][j-1]
    2. 替换,那么开销为cost[i-1][j-1] + 1, 显然替换比直接copy开销大,这个只有当 x[i] != y[j]时候执行。

初始化: cost[i][0] = i, //表示要执行i次删除操作,因为x长度为i,而目标串y长度为0
             cost[0][j] = j, //表示要执行j次插入操作,解释同上。

问题注意:
虽然题目样本里面只有一组测试数据,但是submit时候测试的是多组数据。我提交了好几次只读入一组数据的版本,结果老是WRONG ANSWER,反复检查
解题思路,完全没有问题,真是要命啊。大家要注意一下。

代码写丑了

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>

  4. using namespace std;

  5. class Solution {
  6.     public:
  7.         Solution(): cost(NULL) {
  8.             source = "";
  9.             target = "";
  10.         }
  11.         ~Solution() {
  12.             if (cost) {
  13.                 for (int i=0; i<row; i++)
  14.                     delete []cost[i];
  15.                 delete []cost;
  16.             }
  17.         }

  18.         void init(int r) {
  19.             row = r;
  20.             if (row)
  21.                 cin >> source;
  22.             cin >> col;
  23.             if (col)
  24.                 cin >> target;
  25.             row++;
  26.             col++;
  27.             
  28.             cost = new int*[row];
  29.             for (int i=0; i<row; i++) {
  30.                 cost[i] = new int[col];
  31.                 memset(cost[i], 0, sizeof(int)*col);
  32.             }
  33.             for (int i=1; i<row; i++)
  34.                 cost[i][0] = i;
  35.             for (int j=1; j<col; j++)
  36.                 cost[0][j] = j;
  37.         }

  38.         int minEditionDistance() {
  39.             for (int i=1; i<row; i++) {
  40.                 for (int j=1; j<col; j++) {
  41.                     int deletion = cost[i-1][j] + 1;
  42.                     int insertion = cost[i][j-1] + 1;
  43.                     int min = deletion > insertion ? insertion : deletion;
  44.                     if (source[i-1] == target[j-1]) {
  45.                         cost[i][j] = min < cost[i-1][j-1] ? min : cost[i-1][j-1];
  46.                     } else {
  47.                         int change = cost[i-1][j-1] + 1;
  48.                         cost[i][j] = min < change ? min : change;
  49.                     }
  50.                 }
  51.             }
  52.             return cost[row-1][col-1];
  53.         }

  54.     private:
  55.         int row;
  56.         int col;
  57.         int **cost;
  58.         string source;
  59.         string target;
  60. };

  61. int main() {
  62.     int row;
  63.     while (cin >> row) {
  64.         Solution solution;
  65.         solution.init(row);
  66.         cout << solution.minEditionDistance() << endl;
  67.     }
  68.     return 0;
  69. }


阅读(509) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~