poj 3356
2015-08-16 19:28
337 查看
Description
Let x and y be two strings over some finite alphabet A. We would like to transform
x into y allowing only operations given below:
Deletion: a letter in x is missing in y at a corresponding position.
Insertion: a letter in y is missing in x at a corresponding position.
Change: letters at corresponding positions are distinct
Certainly, we would like to minimize the number of all possible operations.
Illustration
Deletion: * in the bottom line
Insertion: * in the top line
Change: when the letters at the top and bottom are distinct
This tells us that to transform x = AGTCTGACGC into y = AGTAAGTAGGC we would be required to perform 5 operations (2 changes, 2 deletions and 1 insertion). If we want to minimize the number operations, we should do it like
and 4 moves would be required (3 changes and 1 deletion).
In this problem we would always consider strings x and y to be fixed, such that the number of letters in
x is m and the number of letters in y is n where
n ≥ m.
Assign 1 as the cost of an operation performed. Otherwise, assign 0 if there is no operation performed.
Write a program that would minimize the number of possible operations to transform any string
x into a string y.
Input
The input consists of the strings x and y prefixed by their respective lengths, which are within 1000.
Output
An integer representing the minimum number of possible operations to transform any string
x into a string y.
Sample Input
Sample Output
题意:
求由字符串s1,通过下列三种操作:
1.插入一个字符
2.删除一个字符
3.改变一个字符
变换的字符s2所需要 的最小操作次数。
思路:这是一个求编辑最短距离问题。利用动态规划,列出状态方程,设dp[i][j]表示字符串x[1...i]和字符串y[1...j]的最短编辑距离当x[i] == y[j]时,i和j不需要编辑,要么删除,要么插入,要么替换dp[i][j] = min(dp[i-1][j-1], dp[i-1][j] + 1, dp[i][j - 1] + 1)当x[i] != y[i]时, i和j不需要编辑dp[i][j] = min(dp[i-1][j-1] + 1, dp[i-1][j] + 1, dp[i][j-1]
+ 1);注意初始化dp[i][0] = dp[0][i] = i;
代码:
Let x and y be two strings over some finite alphabet A. We would like to transform
x into y allowing only operations given below:
Deletion: a letter in x is missing in y at a corresponding position.
Insertion: a letter in y is missing in x at a corresponding position.
Change: letters at corresponding positions are distinct
Certainly, we would like to minimize the number of all possible operations.
Illustration
A G T A A G T * A G G C | | | | | | | A G T * C * T G A C G C
Deletion: * in the bottom line
Insertion: * in the top line
Change: when the letters at the top and bottom are distinct
This tells us that to transform x = AGTCTGACGC into y = AGTAAGTAGGC we would be required to perform 5 operations (2 changes, 2 deletions and 1 insertion). If we want to minimize the number operations, we should do it like
A G T A A G T A G G C | | | | | | | A G T C T G * A C G C
and 4 moves would be required (3 changes and 1 deletion).
In this problem we would always consider strings x and y to be fixed, such that the number of letters in
x is m and the number of letters in y is n where
n ≥ m.
Assign 1 as the cost of an operation performed. Otherwise, assign 0 if there is no operation performed.
Write a program that would minimize the number of possible operations to transform any string
x into a string y.
Input
The input consists of the strings x and y prefixed by their respective lengths, which are within 1000.
Output
An integer representing the minimum number of possible operations to transform any string
x into a string y.
Sample Input
10 AGTCTGACGC 11 AGTAAGTAGGC
Sample Output
4
题意:
求由字符串s1,通过下列三种操作:
1.插入一个字符
2.删除一个字符
3.改变一个字符
变换的字符s2所需要 的最小操作次数。
思路:这是一个求编辑最短距离问题。利用动态规划,列出状态方程,设dp[i][j]表示字符串x[1...i]和字符串y[1...j]的最短编辑距离当x[i] == y[j]时,i和j不需要编辑,要么删除,要么插入,要么替换dp[i][j] = min(dp[i-1][j-1], dp[i-1][j] + 1, dp[i][j - 1] + 1)当x[i] != y[i]时, i和j不需要编辑dp[i][j] = min(dp[i-1][j-1] + 1, dp[i-1][j] + 1, dp[i][j-1]
+ 1);注意初始化dp[i][0] = dp[0][i] = i;
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1010; char strx[maxn], stry[maxn]; int lenx, leny, dp[maxn][maxn]; int main() { while( scanf("%d %s", &lenx, strx + 1) != EOF) { scanf("%d %s", &leny, stry + 1); int maxv = max(lenx, leny); dp[0][0] = 0; for(int i = 1; i <= maxv; i++) dp[0][i] = dp[i][0] = i; for(int i = 1; i <= lenx; i++) { for(int j = 1; j <= leny; j++) { dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1); if(strx[i] == stry[j]) 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); } } printf("%d\n", dp[lenx][leny]); } return 0; }
相关文章推荐
- HDU 5183 Negative and Positive (NP)(哈希 hash)——BestCoder Round #32
- unity3d PlayerPrefs
- dijstra(迪杰斯特拉)算法的简单实现
- 不能打开参数文件initORCL.ora解决办法
- 【POJ2151】【Check the difficulty of problems】
- 阿里云RDS(云数据库)之产品简介
- Neighbor House
- Xcode快捷键大全
- web.xml 中 classpath 写法说明
- 【IOS开发笔记03-视图相关】简单计算器的实现
- (4)java方法区
- HDOJ 4857 逃生 (逆向拓扑排序)
- 万能的知乎(下):当“水化”危机不可避免,拯救知乎的一千种可能
- Python生成验证码
- CentOS单独编译安装PHP gd库扩展
- foreach遍历----for(object o: list)
- I Hate It
- java正则表达式
- light oj 1047 - Neighbor House 动态规划
- I Hate It