主页/OI/AT_abc185_e-ABC185E-Sequence-Matching
2026年5月5日预计 4 分钟阅读OI

题解:AT_abc185_e [ABC185E] Sequence Matching

zbl2012
zbl2012博主 & 创作者

原题Link

题意

给定字符串 AABB ,可以插入,添加和删除。问最少次数。

Solution

一道 DP 裸题。

先设一下状态

dpi,jdp_{i,j} 表示串 AAii 个字符到串 BBjj 个字符的最少次数。

看一看每一个 dpi,jdp_{i,j} 可以怎么得到:

如果当前有 Ai=BjA_i=B_j 那么继承上一个状态,dpi1,j1dp_{i-1,j-1},直接由前面的状态就可以得到。

否则:

  1. 可以由 i1i-1j1j-1 的匹配情况加上一次修改操作。

  2. 可以由 i1i-1jj 的匹配情况加上一次删除操作。

  3. 可以由 iij1j-1 的匹配情况加上一次添加操作。

所以状态转移方程就可以得出来了

dpi,j=min(dpi1,j+1,dpi,j1+1,dpi1,j1+[aibj])dp_{i,j}=\min(dp_{i-1,j}+1,dp_{i,j-1}+1,dp_{i-1,j-1}+[a_i \ne b_j])

Code:

cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
string s1,s2;//初始字符串 
int l1,l2;
int dp[5000][5000];
int main()
{
      cin>>s1>>s2;
      l1=s1.length();
      l2=s2.length();
      memset(f,127,sizeof(f));
      //dp[i][j]表示把 s1前i位变为 s2的前j位的 最短编辑距离 
      for(int i=0;i<=l2;++i)
         dp[0][i]=i;
      for(int i=0;i<=l1;++i)
         dp[i][0]=i;
      for(int i=1;i<=l1;++i)
      {
             for(int j=1;j<=l2;++j)
             {
                     if(s1[i-1]==s2[j-1])
                        dp[i][j]=min(dp[i][j],dp[i-1][j-1]);//如果两位相同 
                     else 
                     dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);//上一位的基础上加"替换"
                     dp[i][j]=min(dp[i][j],dp[i][j-1]+1);//上一个的基础上加"添加"
                     dp[i][j]=min(dp[i][j],dp[i-1][j]+1);//上一位的基础上加"删除" 

             }
      }
      cout<<dp[l1][l2];
      return 0;
}

文章留言区

已有 0 条精彩探讨

正在拼命加载留言中...

发表您的见解

※ 提倡客观理性讨论。留言需要经过安全核查,请勿注入恶意链接。
上一篇文章题解:SP15558 IITKWPCE - Let us play with strings下一篇文章 题解:P15395 幻影之春 / phantom