• Luogu-P2758 编辑距离


     

    题目

    题目链接

    测试得分:  100

    主要算法 :  动态规划,区间DP,字符串

     

    题干:

       区间字符串DP板子题

    应试策略:

    1. 确定算法区间DP
    2. 确定状态//f[i][j]字符串sta(sta[0]-sta[i-1])转化到字符串stb(stb[0]-stb[j-1])的最短编辑距离 
    3. 初始状态与边界 将sta删除i个:f[i][0](0<=i<=n),将stb插入j个:f[0][j](0<=j<=m)
    4. 状态转移:
      1.   当sta[i-1]==stb[j-1]时,f[i][j]=fi-1][j-1]//不需要处理   
      2.        当sta[i-1]!=stb[j-1]时,考虑三种情况,将a[i-1]转化为b[j-1](继承f[i-1][j-1]),删除a[i-1](继承f[i-1][j]),插入b[j-1](继承f[i][j-1]),三者取最小值的基础上加操作数1(f[i][j]=min(min(f[i-1][j-1],f[i-1][j]),f[i][j-1])+1;)

       代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream> 
    #include<string.h>
    #define FORa(i,s,e) for(int i=s;i<=e;i++)
    #define FORs(i,s,e) for(int i=s;i>=e;i--)
    
    using namespace std;
    
    const int N=2000;
    string sta,stb;
    int m,n,f[N+1][N+1];//f[i][j]字符串sta(sta[0]-sta[i-1])转化到字符串stb(stb[0]-stb[j-1])的最短编辑距离 
    inline int min(int a,int b){return a<b?a:b;}
    int main()
    {
        cin>>sta>>stb;
        n=sta.size(),m=stb.size();
        memset(f,127/3,sizeof(f));
        FORa(i,1,n) f[i][0]=i;
        FORa(i,1,m) f[0][i]=i;
        f[0][0]=0;//注意边界与初值,当两字符串中存在空串处理 
        FORa(i,1,n)
            FORa(j,1,m)
                if(sta[i-1]==stb[j-1]) f[i][j]=f[i-1][j-1];//当当前字符相同 ,答案等于之前每个减一位的答案 
                else f[i][j]=min(min(f[i-1][j-1],f[i-1][j]),f[i][j-1])+1;
                //f[i-1][j-1]表示把sta[i-1]改成stb[j-1] f[i-1][j]表示把字符串sta中的sta[i]删除 f[i][j-1]表示字符串sta后插入stb[j] 
        printf("%d",f[n][m]);
        return 0;
    }

    总结:

      策略与状态设计的准确性

  • 相关阅读:
    接口与抽象类的区别
    全排列(按字典序)
    设置mysql数据库的密码
    android中操作SQLite注意事项
    Android: Fragment详解
    android设置组件所占的比例
    九度oj 1482:玛雅人的密码
    ACM模板
    洛谷 P1156 垃圾陷阱
    AtCoder Beginner Contest 187 F
  • 原文地址:https://www.cnblogs.com/SeanOcean/p/11211632.html
Copyright © 2020-2023  润新知