编辑距离

题目:

https://www.luogu.com.cn/problem/P2758

代码:

//#define DEBUG

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<math.h>

#include<algorithm>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<queue>
#include<set>
#include<map>
using namespace std;

const int inf = 1e9 + 7;
const int maxn = 1e5 + 7;

#define ls (rt << 1)
#define rs (rt << 1 | 1)
#define md (l + r >> 1)
#define endl  '\n'

typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef pair<int, int> PII;
typedef pair<PII, PII>PPI;

inline int gcd(int x, int y) { if (y == 0)return x; return gcd(y, x % y); }
inline void tie0() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); }

void read(int& x)
{
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s>'9') { if (s == '-')f = -1; s = getchar(); }
    while (s >= '0' && s <= '9') { x = x * 10 + s - '0'; s = getchar(); }
    x *= f;
}

int c[2007][2006]={0};
signed main()
{
    tie0();
    char a[2007],b[2007];
    cin>>a>>b;
    int lena =strlen(a);
    int lenb=strlen(b);
     int ans=0;
//曾删
     //边界
    c[0][0]=0;
    for(int j=1;j<=lenb;j++)
        c[0][j]=j;
     for(int i=1;i<=lena;i++)
        c[i][0]=i;
    for(int i=1;i<=lena;i++)
       for(int j=1;j<=lenb;j++)
    {   if(a[i-1]==b[j-1])
           c[i][j]=c[i-1][j-1];
           else
        c[i][j]=min(c[i][j-1],min(c[i-1][j-1],c[i-1][j]))+1;
    }
         printf("%d\n",c[lena][lenb]);
}

dp[i][j]表示甲的前i位和乙的前j位需要的操作数

处理边界
当i为0的时候,得增加j位

当j为0时,同理

代码中的else里的c[i][j-1]到c[i][j]为增加一位,c[i-1][j-1]到c[i][j]为替换一位,

posted @ 2021-07-27 14:36  废柴废柴少女  阅读(17)  评论(0)    收藏  举报