• sdut 1728 编辑距离问题( dp )


    题目

    思路:edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。

    有如下动态规划公式:

    • if i == 0 且 j == 0,edit(i, j) = 0
    • if i == 0 且 j > 0,edit(i, j) = j
    • if i > 0 且j == 0,edit(i, j) = i
    • if i ≥ 1  且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。
    •  1 #include <iostream>
       2 #include <cstring>
       3 #include <cstdlib>
       4 #include <cmath>
       5 #include <cstdio>
       6 #include <algorithm>
       7 using namespace std;
       8 const int maxn = 2000+10;
       9 char a[maxn], b[maxn];
      10 int d[maxn][maxn];
      11 int _min(int a, int b)
      12 {
      13     return a>b ? b:a;
      14 }
      15 
      16 int main()
      17 {
      18     int i, j, len_a, len_b, x;
      19     while(cin>>a>>b)
      20     {
      21         len_a = strlen(a);
      22         len_b = strlen(b);
      23         d[0][0] = 0;
      24         for(i = 1; i <= len_a; i++)
      25             d[i][0] = i;
      26         for(j = 1; j <= len_b; j++)
      27             d[0][j] = j;
      28         for(i = 1; i <= len_a; i++)
      29             for(j = 1; j <= len_b; j++)
      30             {
      31                 x = 0;
      32                 d[i][j] = _min(d[i-1][j] + 1, d[i][j-1] + 1);
      33                 if(a[i-1] != b[j-1])
      34                     x = 1;
      35                 d[i][j] = _min(d[i][j], d[i-1][j-1] + x);
      36             }
      37             cout<<d[len_a][len_b]<<endl;
      38     }
      39     return 0;
      40 }
  • 相关阅读:
    jdb应用 远程调试
    maven POM总结
    jvm
    jdbc取出表名 名称
    nginx配置openssl证书
    DNS A记录 CNAME NS记录等的区别
    linux文件目录类命令|--cd指令
    linux文件目录类命令--ls命令
    linux文件目录类命令--pwd命令
    linux 帮助指令
  • 原文地址:https://www.cnblogs.com/bfshm/p/3667130.html
Copyright © 2020-2023  润新知