51nod--1183 编辑距离(动态规划)
2016-03-20 00:08
344 查看
题目:
1183 编辑距离基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。
Input
第1行:字符串a(a的长度 <= 1000)。
第2行:字符串b(b的长度 <= 1000)。
Output
输出a和b的编辑距离
Input示例
kitten
sitting
Output示例
3
分析:
首先, 对于一个状态 Dp[i][j] = min(Dp[i-1][j], min(Dp[i][j-1], Dp[i-1][j-1])) + 1; 对于当前状态, 往任何一个串后添加一个字符, 所需要的操作数 + 1的。(先不讨论相等, 不相等。) 如果 a[i] == b[j] , Dp[i][j] = min(Dp[i][j], Dp[i-1][j-1]); 两个字符相等是不需要添加任何操作的。
实现:
#include <bits/stdc++.h> using namespace std; const int maxn = 1000 + 131; int Dp[maxn][maxn]; int Solve(const string& a, const string& b) { int n = a.length(); int m = b.length(); for(int i = 0; i < n; ++i) Dp[i][0] = i; for(int i = 0; i < m; ++i) Dp[0][i] = i; /// for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) { Dp[i][j] = min(Dp[i-1][j], min(Dp[i][j-1], Dp[i-1][j-1])) + 1; if(a[i-1] == b[j-1]) Dp[i][j] = min(Dp[i][j], Dp[i-1][j-1]); } return Dp [m]; } int main() { string s, t; while(cin >> s >> t) { cout << Solve(s, t) << endl; } }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits
- 字符串编辑距离
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)