zoukankan      html  css  js  c++  java
  • 线性dp①

    RT

    题目描述

    设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

    1、删除一个字符;

    2、插入一个字符;

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

    !皆为小写字母!

    输入输出格式

    输入格式:

     第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。

    输出格式:

     只有一个正整数,为最少字符操作次数。

     输入输出样例

    输入样例      输出样例
    sfdqxbw          4
    gfdgw

    看见求最优解,首先想到dp;
    然后发现好像和最长公共子序列有关;
    理性分析
                      loading......

    令dp[i][j]为a1...ai和b1...bj的匹配最小改动长度
    则如果ai==bj
    dp[i][jj=dp[i-1][j-1];
    如果不匹配
    则可以选ai或bj或 (我全都要!!!
    dp[i][j]=min( min(dp[i][j-1],dp[i-1][j]) ,dp[i-1][j-1]) +1;
    好了;
    别忘了赋初值;
    骚代码
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    
    using namespace std;
    
    char a[2010],b[2010];
    int a1[2010],b1[2010];
    int lena,lenb;
    int dp[2010][2010];
    int main()
    {
        freopen("in","r",stdin);
        scanf("%s",a);
        printf("%s\n",a);
        scanf("%s",b);
        printf("%s\n",b);
        lena=strlen(a);
        lenb=strlen(b);
        for(int i=1;i<=lena;++i) dp[i][0]=i;
        for(int i=1;i<=lenb;++i) dp[0][i]=i;
        for(int i=1;i<=lena;++i)
        {
            for(int j=1;j<=lenb;++j)
            {
                if(a[i-1]==b[j-1])
                {
                    dp[i][j]=dp[i-1][j-1];
                    continue;
                }
                dp[i][j]=min(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;
            }
        }
        printf("%d",dp[lena][lenb]);
    }

     
  • 相关阅读:
    mongo连接拒绝10061原因
    python爬取CNKI的期刊
    C语言socket编程
    Linux c time模块函数库
    linux下python3调用c代码或者python3调用c++代码
    stl综合
    linux c调用 mysql代码
    debian系列下c++调用mysql, linux下面安装mysql.h文件
    c++ linux socket编程 c++网络编程
    比较均值分析思路
  • 原文地址:https://www.cnblogs.com/AidenPearce/p/8289802.html
Copyright © 2011-2022 走看看