zoukankan      html  css  js  c++  java
  • edit

     试题编号:1119 收 藏   
    ZYC编辑距离F920
    难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
    试题描述
    设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

    1、删除一个字符;

    2、插入一个字符;

    3、将一个字符改为另一个字符。 

    对任的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。

    输入
    第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。
    输出
    只有一个正整数,为最少字符操作次数。
    输入示例
    sfdqxbw
    gfdgw
    输出示例
    4

    今天又考试了QAQ。

    思路:这道题是一道典型的动规,输入字符串a和b后,我们知道有三种待转移情况:替换(dp[i][j]=dp[i-1][j-1+1),删除(dp[i][j]=dp[i-1][j]+1),插入(dp[i][j]=dp[i][j-1]),当然这是不等的情况,如果相等就是dp[i][j]=dp[i-1][j-1]。既然我们要求最小,如果相等,就直接赋值就好了。如果不等,就用min判断这三种待转移状态哪个最小就好了。蛮简单的一道dp,只要想出转移方程的话这道题就很简单了。然后上参考代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 char a[2005],b[2005];
     4 int la,lb,dp[2005][2005];
     5 int main()
     6 {
     7     gets(a+1);//从1开始读入 
     8     gets(b+1);
     9     la=strlen(a+1);//看字符串长度 
    10     lb=strlen(b+1);
    11     for(int i=1;i<=la;i++) dp[i][0]=i;//赋边界值 
    12     for(int i=1;i<=lb;i++) dp[0][i]=i;
    13     for(int i=1;i<=la;i++)
    14     {
    15         for(int j=1;j<=lb;j++)
    16         {
    17             if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1];//如果相等,就直接复制 
    18             else dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;//不等就判断哪种待转移状态最小 
    19         }
    20     }
    21     printf("%d",dp[la][lb]);//输出 
    22     return 0;//完美结束 
    23 }
  • 相关阅读:
    python字典推导式
    什么是Python 自省
    类变量和实例变量
    Python 使用正则表达式匹配URL网址
    python is 和 “==”的区别
    阮一峰老师的bash教程,建议阅读
    python里的闭包
    什么是生成器
    python访问限制
    pytorch使用Tips
  • 原文地址:https://www.cnblogs.com/jiuduSHENBENG/p/9495602.html
Copyright © 2011-2022 走看看