POJ 3356(最短编辑距离问题)
POJ - 3356
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:
Certainly, we would like to minimize the number of all possible operations.
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 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 Sample Output 4 |
题解:给你两行字符串,第一行为A长度m,第二行为B,长度n,dp[i][j]表示编辑A前i字母和编辑B的前j个字母所需要的操作次数。这里我们要求最少的操作次数。
我们可以执行的操作有删除,插入,还有替换。
解题思路:
长当某一个字符串为空时,那么可以得到dp[0][i] = i和dp[i][0]=i,因为某一字符串为空的,要得到另一个i长度字符串,必须经过i次插入操作。
如果A比B:
如果没有空字符串,有3中操作选择,
1.替换 ,将a[0]和b[0]判断,如果相等,即返回上一个字符的,操作次数加1,即dp[i-1][j-1]+1.
2.删除,所以删除A一个字符,
也就是必须有一次操作,删除A[ ]后,返回A的前一个字符,即dp[i-1][j]+1
3.插入,在B添加一个字符,A不变,如果执行完相等,就要找B的前一个去匹配,所以要减1,和A去匹配,执行了一次,操作次数要加1,即dp[i][j-1] + 1
如果B比A长,则删除和插入交换。
每次选出这三种执行操作数最少的就可以了。
下面的代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[][];
char a[],b[];
int m,n;
int main()
{
while(~scanf("%d %s",&m,a+))
{
scanf("%d %s",&n,b+);
int maxl=max(m,n);
for(int i=;i<=maxl;i++)
{
dp[i][]=i;
dp[][i]=i;
}
for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)
{
if(a[i]==b[j])
dp[i][j]=dp[i-][j-];
else
dp[i][j]=min(min(dp[i-][j]+,dp[i][j-]+),dp[i-][j-]+);
}
}
cout<<dp[m][n]<<endl;
}
}
POJ 3356(最短编辑距离问题)的更多相关文章
- POJ 3356 AGTC(最小编辑距离)
POJ 3356 AGTC(最小编辑距离) http://poj.org/problem?id=3356 题意: 给出两个字符串x 与 y,当中x的长度为n,y的长度为m,而且m>=n.然后y能 ...
- POJ_3356——最短编辑距离,动态规划
Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...
- poj 3356
Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...
- (5千字)由浅入深讲解动态规划(JS版)-钢条切割,最大公共子序列,最短编辑距离
斐波拉契数列 首先我们来看看斐波拉契数列,这是一个大家都很熟悉的数列: // f = [1, 1, 2, 3, 5, 8] f(1) = 1; f(2) = 1; f(n) = f(n-1) + f( ...
- POJ 3356 AGTC(DP-最小编辑距离)
Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...
- POJ 3356 AGTC(DP求字符串编辑距离)
给出两个长度小于1000的字符串,有三种操作,插入一个字符,删除一个字符,替换一个字符. 问A变成B所需的最少操作数(即编辑距离) 考虑DP,可以用反证法证明依次从头到尾对A,B进行匹配是不会影响答案 ...
- poj 3356 AGTC(线性dp)
题目链接:http://poj.org/problem?id=3356 思路分析:题目为经典的编辑距离问题,其实质为动态规划问题: 编辑距离问题定义:给定一个字符串source,可以对其进行复制,替换 ...
- POJ 3356.AGTC
问题简述: 输入两个序列x和y,分别执行下列三个步骤,将序列x转化为y (1)插入:(2)删除:(3)替换: 要求输出最小操作数. 原题链接:http://poj.org/problem?id=335 ...
- POJ 3356 水LCS
题目链接: http://poj.org/problem?id=3356 AGTC Time Limit: 1000MS Memory Limit: 65536K Total Submission ...
随机推荐
- zoj 1586
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1586 //zoj 1586 #include<iostream> ...
- Prime Ring Problem(搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1016 / 题意; 给你一个数n ,求出所有的排列 这些排列的特征是任意相邻的两数只和是素数,而且首位只和也是素数 ...
- 尚学堂 JAVA DAY12 java程序执行时内存的分配
- Scrapy:Python的爬虫框架
网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻 ...
- 布隆过滤器的java实现
package com.kaikeba.data.jobspider.util; import java.util.BitSet; public class Bloomfilter { private ...
- js~fancybox为我们提供的iframe功能
对于fancybox我们已经耳熟能详了,一般用来到表单的弹框,提示弹框等,而今天,我们将分页列表也使用fancybox来实现一下,这东西听起来简单,但做起来还真不是那么回事,有事细节需要我们注意的,首 ...
- c#简单数组
int[,] a=new int[,]{{1,2},{3,4},{5,6}};//二维数组 textbox.text=a[0,1];//=2 int[][] b={new int[]{1,2},new ...
- PHPExcel讀取excel數據
require_once 'PHPExcel.php'; $PHPReader = new PHPExcel_Reader_Excel2007(); $filePath = 'wjyl.xlsx'; ...
- [转] add-apt-repository
PS: 有些项目提供的是deb 地址,那么把deb地址加到repository里,下面是一个例子: sudo apt-get update sudo add-apt-repository 'deb h ...
- python增删改查
###增删改查 names = ["zhangding","wangxu","wudong","cheng"] #增na ...