Luogu

分析

这是一道DP题。
设$f[i][j]$表示A串的前i个字符和B串的前j个字符的最小字串距离。

A串的第i个字符可以与B串的第j个字符匹配,也可以和空格匹配,B串的第j个字符也可以和空格匹配。
那么我们得到状态转移方程:
$f[i] [j] = min(min(f[i] [j-1],f[i-1] [j])+k, f[i-1] [j-1]+|a[i]-b[i]|)$

代码

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
char a[2010],b[2010];
int f[2010][2010];
int main()
{
    int k; gets(a); gets(b); scanf("%d",&k); //输入  
    int la=strlen(a),lb=strlen(b); f[0][0]=0;
    for (int i=1;i<=la;i++) f[i][0]=i*k; //全是空格的情况  
    for (int i=1;i<=lb;i++) f[0][i]=i*k; //同上  
    for (int i=1;i<=la;i++) //DP过程(核心代码) 
        for (int j=1;j<=lb;j++)
        {
            int now=abs(a[i-1]-b[j-1]); 
            f[i][j]=min(min(f[i-1][j],f[i][j-1])+k,f[i-1][j-1]+now);
        }
    printf("%d\n",f[la][lb]); //输出答案  
    return 0;
}

提示

  • 注意到输入为字符串,所以下标要注意
  • 要分三种情况,不要遗漏
  • 注意边界
最后修改:2019 年 09 月 23 日 10 : 03 PM