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]);
    }

     
  • 相关阅读:
    第一篇:数据仓库概述
    第五篇:数据库系统的实现
    第四篇:SQL
    Django框架ORM常用参数汇总_模型层
    Django框架ORM常用字段汇总_模型层
    Boost.Asio的使用技巧
    Boost库之asio io_service以及run、run_one、poll、poll_one区别
    Boost::asio io_service 实现分析
    boost asio中io_service类的几种使用
    boost::io_service解读
  • 原文地址:https://www.cnblogs.com/AidenPearce/p/8289802.html
Copyright © 2011-2022 走看看