编辑距离
题目:
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]为替换一位,
浙公网安备 33010602011771号