• 【noi 2.6_2988】计算字符串距离(DP)


    题意: 给两个字符串,可以增、删、改,问使这两个串变为相同的最小操作数。

    解法:(下面2种的代码主要区别在初始化和,而状态转移方程大家可挑自己更容易理解的方法打)

    1.f[i][j]表示a串前i个和b串前j个完成匹配的最小操作数。

    2.f[i][j]表示a串前i-1个和b串前j-1个完成匹配的最小操作数。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 using namespace std;
     6 #define N 1010
     7 
     8 char a[1010],b[1010];
     9 int f[1010][1010];
    10 
    11 int mmin(int x,int y)
    12 {   return x<y?x:y;   }
    13 int main()
    14 {
    15     //freopen("a.in","r",stdin);
    16     int T;
    17     scanf("%d",&T);
    18     f[0][0]=0;
    19     for (int i=1;i<=N;i++)
    20       f[i][0]=i, f[0][i]=i;
    21     while (T--)
    22     {
    23       scanf("%s%s",a+1,b+1);
    24       int la=strlen(a+1),lb=strlen(b+1);
    25       for (int i=1;i<=la;i++)
    26        for (int j=1;j<=lb;j++)
    27        {
    28          f[i][j]=mmin(f[i][j-1]+1,f[i-1][j]+1);//add del
    29          if (a[i]==b[j]) f[i][j]=mmin(f[i][j],f[i-1][j-1]);
    30          else f[i][j]=mmin(f[i][j],f[i-1][j-1]+1);//change
    31        }
    32       printf("%d
    ",f[la][lb]);
    33     }
    34     return 0;
    35 }
    View Code 1
     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 using namespace std;
     6 
     7 const int L=1010;
     8 char s[L],ss[L];
     9 int f[L][L];
    10 void upd(int &x,int y) {x=x<y?x:y;}
    11 
    12 int main()
    13 {
    14     int n;
    15     scanf("%d",&n);
    16     while (n--)
    17     {
    18       scanf("%s%s",s+1,ss+1);
    19       int l=strlen(s+1),ll=strlen(ss+1);
    20       memset(f,63,sizeof(f));
    21       f[1][1]=0;
    22       for (int i=1;i<=l+1;i++)
    23        for (int j=1;j<=ll+1;j++)
    24        {
    25          if (f[i][j]>100010) continue;
    26          upd(f[i+1][j],f[i][j]+1),upd(f[i][j+1],f[i][j]+1);
    27          if (s[i]==ss[j]) upd(f[i+1][j+1],f[i][j]);
    28          else upd(f[i+1][j+1],f[i][j]+1);
    29          int x=1;
    30        }
    31       printf("%d
    ",f[l+1][ll+1]);
    32     }
    33     return 0;
    34 }
    View Code 2
  • 相关阅读:
    由 container 一词所想到的
    突然间,firebug中不显示用console.log打印的信息了
    学习计划表-快照-2017.2.16
    学习编程让我成功减肥!
    什么是编程?
    计算两个事件之间的时间差
    使用substring和split方法从字符串中抽取一组清单
    js中十进制数转换为16进制
    Definition of success-成功的定义
    如何让老式浏览器支持html5新增的语义元素
  • 原文地址:https://www.cnblogs.com/konjak/p/5933966.html
Copyright © 2020-2023  润新知