动态规划--P2758 编辑距离

*传送

动态规划最主要确定状态和转移方程,所以我的思路如下:

1.定义状态:

确定dp(i,j)代表字符串A的前i个字符(包括第i个)变为字符串B的前j个(包括第j个)需要多少步。而dp[l1][l2]就是我们所要找的答案。

2.转移方程:

*删:dp(i-1,j)+1 //字符串A的前i-1个字符变为字符串B的前j个需要多少步 【把字符串的第i个字符(最后一个)删除了】,删除需要一步因此加1

*添:dp(i,j-1)+1 //将B[j]字符加在A字符串的最后面即添加,同样可以理解为将B[j]字符删掉(因为不用再考虑了)。

//字符串A的前i个字符变为字符串B的前j-1个需要多少步 添加需要一步因此加1

*替:dp(i-1,j-1)+1 //字符串A和B的最后两个都相等了,因此都不用再考虑

//字符串A的前i-1个字符变为字符串B的前j-1个需要多少步 添加需要一步因此加1

*不变:dp(i-1,j-1)//字符串A和B的最后两个都相等,不考虑。

反观这道题,如果两个字符串当前位置上相同,就可以不变,如果不相同就需要进行三种操作,取一种最小的。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <cstring>
 6 using namespace std;
 7 char s1[2005],s2[2005];
 8 long long dp[2005][2005];
 9 int main(){
10     scanf ("%s%s",s1+1,s2+1);
11     int l1=strlen(s1+1),l2=strlen(s2+1);
12     for (int i = 0;i <= l1;i++) dp[i][0]=i;
13     for (int i = 0;i <= l2;i++) dp[0][i]=i;
14     for (int i = 1;i <= l1;i++){
15         for(int j = 1;j <= l2;j++){
16             if (s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1];
17             else dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
18         }
19     }
20     cout<<dp[l1][l2];
21     return 0;
22 }

原文地址:https://www.cnblogs.com/very-beginning/p/12400724.html

时间: 2024-10-31 14:14:16

动态规划--P2758 编辑距离的相关文章

动态规划之编辑距离

思考:我们可以从题目中给出的6种操作描述,找到递归式,比如复制操作是i和j都增加1.那么递归式就是c[i][j]=c[i-1][j-1]+cost[COPY].c[i][j]表示从字符串i复制到字符串j所需要的总代价.其他操作类似. 递归式如下: 代码如下: #include <iostream> using namespace std; enum {COPY,REPLACE,DELETE,INSERT,TWIDDLE,KILL,ENUM_MAX};//TWIDDLE旋转 struct T {

洛谷——P2758 编辑距离

P2758 编辑距离 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字母! 输入输出格式 输入格式: 第一行为字符串A:第二行为字符串B:字符串A和B的长度均小于2000. 输出格式: 只有一个正整数,为最少字符操作次数. 输入输出样例 输入样例#1: 复制 sfdqxbw gfdgw 输出样例#1: 复制 4 dp 我们用f[i][j]表示a字

动态规划:编辑距离和通配符匹配

编辑距离指通过修改,删除,添加.使得两个字符串能够相同所需要操作的次数. edit(i,j) if S1[i]==S2[j] temp=0; else temp=1; edit(i,j)=min(A[i-1][j-1]+temp,A[i-1][j]+1,A[i][j-1]+1); edit(i,j)=min(A[i-1][j-1]+temp,A[i-1][j]+1,A[i][j-1]+1);公式可以理解成, 如果由S1或者增加,删除,替换一次,同两个字符串的推前一个的编辑距离比较.最小值即编辑距

动态规划求解编辑距离

一.动态规划算法 动态规划算法通常基于一个递推公式及一个或多个初始状态.当前问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式复杂度,因此它比 回溯法.暴力法要快.首先,我们要找到某个状态的最优解,然后在它的帮助下,找到下一个状态的最优解.要做的是抽象出动态规划的状态和状态转移方程(递推公式). 二.编辑距离 1.问题描述 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: (1)删除一个字符; (2)插入一个字符: (3)将一个字符改为另一

动态规划——最短编辑距离

编辑距离是指两个字串之间,从一个转成另一个所需要的最少编辑操作次数,许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 问题     给定两个字符串S1和S2,求S2和S1的编辑距离,即至少需要经过多少步编辑操作才可以将S1变成S2. 分析     定义“状态” edit[i][j],表示将S1的长度为i的前缀S1[1...i]到S2的长度为j的前缀S2[1....j]的编辑距离.则显然有: if (i == 0 && j == 0) edit[i][j] = 0;

洛谷 P2758 编辑距离

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接 https://www.luogu.org/problemnew/show/2758#sub 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字母! 输入输出格式 输入格式: 第一行为字符串A:第二行为字符串B:字符串A和B的长度均小于2000. 输出格式: 只有一个正

P2758 编辑距离 简单DP

Description 要把两个字符串变成相同的字符串 一共可以利用以下三种操作: 1.把串中任意一个字符删去: 2.在串中任意一个位置插入一个字符: 3.把串中任意一个字符变成其他任意字符: 问至少要多少次操作才能让两个字符串相同? (https://www.luogu.com.cn/problem/P2758) Solution 状态:设\(F[i][j]\)为把\(s1[0]-s1[i - 1]\)变为\(s2[0]-s2[j - 1]\)所需要的步数. 对于\(f[i][j]\)若相等,

poj3356 AGTC(经典DP最小编辑距离)

题目意思: 给出两个字符串X,Y,求出从X-->Y的最小操作次数,只可以删除,添加,修改一个字符. http://poj.org/problem?id=3356 题目分析: /** *x,y:是字符串 *动态规划最小编辑距离, *dp[i][j]表示取x的前i个字符和y的前j个字符操作的最小次数. *dp[0][j]=j:取x的前0个字符和y的前j个字符操作的 *最小次数为(j),只能添加到x * *dp[i][0]=i:取x的前i个字符和y的前0个字符操作的 *最小次数为(i),只能删除x *

Minimum Edit Distance with Dynamic Programming

1. Question / 实践题目 2. Analysis / 问题描述 3. Algorithm / 算法描述 3.1. Substitution 3.2. Insertion 3.3. Deletion 3.4. Sepcial Cases 3.5. Equation 4. Fill the table / 填表 4.1. Dimention 4.2. Range 4.3. Order 4.4. Related Code 5. Show Me the Code / 完整代码 6. T(n)