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

总结:

  策略与状态设计的准确性

原文地址:https://www.cnblogs.com/SeanOcean/p/11211632.html