字符串DP

这两道题我在网上找了好久只发现了一个关于这道题的解题报告,现在终于看明白了,所以我决定写一个稍微好一些的,由于本人理解能力有限,可能此题深度不够,望指点,谢谢。

Problem 2172 巡了南山我巡北山

Accept: 20    Submit: 67
Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

  大师兄在取经途中迷上了ACM-ICPC,稍不留神,师傅就被妖怪抓走了。

  大师兄并不着急去救师傅,在虐这道简单题:

  有两个字符串A和B,每一次可以选择以下操作中的一种,只对字符串A进行操作,用最少的操作使得字符串A与字符串B相等:

在字符串A中插入一个字符;

在字符串A中删除一个字符;

将字符串A复制,得到字符串A的一个拷贝C,将字符串C接在字符串A后面。

Input

  每组输入数据包含两行,第一个一个字符串A,第二行一个字符串B。输入字符串最大长度为10。

如果最少操作次数大于15,则输出”more than 15 operations.”。

Output

  对每组输入数据,输出最少的操作次数,使得字符串A与字符串B相等。

Sample Input

a aaaa ac aaaaa

Sample Output

2 4
*******************************************************分割线*******************************************************************************
如果没有接触过类似类型的人来说直接做有些难,不妨我们先做一个简单的。
编辑距离
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 261(104 users) Total Accepted: 130(97 users) Rating: Special Judge: No
Description
俄罗斯科学家Vladimir
Levenshtein在1965年提出了编辑距离概念。编辑距离,又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的三种编辑操作包括插入一个字符、删除一个字符、将一个字符替换成另一个字符。

至今,编辑距离一直在相似句子检索的领域中发挥着不可忽视的作用。

我们不妨来设计一个程序,计算两个字符串的编辑距离。

Input
输入数据的第一行是一个正整数,表示一共有几组数据。

每组数据有两行,每行一个字符串。

* 每个字符串长度不超过1000

* 字符串中只含小写英文字母
Output
对于每组数据,请输出一个整数表示两个字符串的编辑距离。

每个答案占一行。

Sample Input
2

david

vivian

abc

aabbcc

Sample Output
4

3

这道题看着就少了一种操作,不过多了一个替换,那我们先从替换入手,首先什么时候需要替换?当然是两个字符不一样的时候,这也是我们唯一能做出准确判断的操作(请好好理解这句哈),面对其他操作时,我们只能先试一试,这就是DP的填表法,我们不知道从哪个状态走来是最佳,并且每一步都不知道从哪走来事最佳,所以我们必须把所有状态都记录下来,即做一个数组,储存所有状态,并且我们要对已知的状态进行初始化,这时我们只要知道了初状态和状态转移方程就可以打出所有状态了,我们先想状态转移方程,首先我们要明白的是我们要处理的是s1和s2字符串的字符而不是字符串,可以类似的是选某个字符添加到另一个字符串中(不是s2和s1),那个字符串是在我们搜处理的字符前的所有字符已经和s2相等了,在理解这些的情况下我们就可以通过状态转移方程来对表来填值,那我们先想替换的状态转移方程,我们状态转移方程的目的是给所打表的位置附上到此状态的最优解,首先替换的情况会出现在要比较的两个字符不相等的情况,替换我们需要一步的操作,这不操作不用考虑是否最优,因为我们这不操作是必须的,但是如果执行完此操作或本身相等的话那就会出现他从另一个状态变到这个状态,这时我们就会出现探讨谁是最优解的问题,当然步数少的是最优解,说道最优解不得不说这点(关键是我思路乱)最后一步一定通过有限种方法由上一步的变成,而且每一步都是这样
 
原文地址:https://www.cnblogs.com/VectorLin/p/5317282.html