问题简述:

  输入两个序列x和y,分别执行下列三个步骤,将序列x转化为y

  (1)插入;(2)删除;(3)替换;

  要求输出最小操作数。

  原题链接:http://poj.org/problem?id=3356

解题思路:

  明显的动态规划题,输入两个字符串 a[0...m-1] , b[0...n]

  使用二维数组 dp[i,j] 记录 a[0...i] 和 b[0...j] 对应的最小操作数

  显然有以下递归方程:

  dp[i,0] = i

  dp[0,j] = j

  dp[i,j] = dp[i-1,j-1]     if a[i-1]==b[j-1]

  dp[i,j] = min(dp[i-1,j-1],dp[i-1,j],dp[i,j-1]) + 1    if a[i-1]!=b[j-1]

源代码

  1. /*
  2. OJ: POJ
  3. ID: 3013216109
  4. TASK: 3356.AGTC
  5. LANG: C++
  6. NOTE: DP
  7. */
  8. #include <cstdio>
  9.  
  10. const int MAX=;
  11. int m,n,i,j,k;
  12. char a[MAX],b[MAX];
  13. int dp[MAX][MAX],c[MAX];
  14.  
  15. int min(int x,int y,int z) {
  16. if(x<+y&&x<=z)
  17. return x;
  18. if(y<=x&&y<=z)
  19. return y;
  20. if(z<=x&&z<=y)
  21. return z;
  22. }
  23.  
  24. int main()
  25. {
  26. while(scanf("%d %s",&m,a)!=EOF) {
  27. scanf("%d %s",&n,b);
  28. for(i=;i<=m;i++)
  29. dp[i][]=i;
  30. for(j=;j<=n;j++)
  31. dp[][j]=j;
  32. k=;
  33. for(i=;i<=m;i++) {
  34. for(j=;j<=n;j++) {
  35. if(a[i-]==b[j-])
  36. dp[i][j]=dp[i-][j-];
  37. else
  38. dp[i][j]=min(dp[i-][j-],dp[i-][j],dp[i][j-])+;
  39. }
  40. }
  41. printf("%d\n",dp[m][n]);
  42. }
  43. return ;
  44. }

POJ 3356.AGTC的更多相关文章

  1. POJ 3356 AGTC(最小编辑距离)

    POJ 3356 AGTC(最小编辑距离) http://poj.org/problem?id=3356 题意: 给出两个字符串x 与 y,当中x的长度为n,y的长度为m,而且m>=n.然后y能 ...

  2. poj 3356 AGTC(线性dp)

    题目链接:http://poj.org/problem?id=3356 思路分析:题目为经典的编辑距离问题,其实质为动态规划问题: 编辑距离问题定义:给定一个字符串source,可以对其进行复制,替换 ...

  3. POJ 3356 AGTC(最长公共子)

    AGTC Description Let x and y be two strings over some finite alphabet A. We would like to transform  ...

  4. POJ 3356 AGTC(DP-最小编辑距离)

    Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...

  5. POJ 3356 AGTC(DP求字符串编辑距离)

    给出两个长度小于1000的字符串,有三种操作,插入一个字符,删除一个字符,替换一个字符. 问A变成B所需的最少操作数(即编辑距离) 考虑DP,可以用反证法证明依次从头到尾对A,B进行匹配是不会影响答案 ...

  6. POJ 3356(最短编辑距离问题)

    POJ - 3356 AGTC Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Desc ...

  7. POJ 3356 水LCS

    题目链接: http://poj.org/problem?id=3356 AGTC Time Limit: 1000MS   Memory Limit: 65536K Total Submission ...

  8. Poj 3356 ACGT(LCS 或 带备忘的递归)

    题意:把一个字符串通过增.删.改三种操作变成另外一个字符串,求最少的操作数. 分析: 可以用LCS求出最大公共子序列,再把两个串中更长的那一串中不是公共子序列的部分删除. 分析可知两个字符串的距离肯定 ...

  9. poj 3356

    Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...

随机推荐

  1. vim简单命令教程-firstblood

    你想以最快的速度学习人类史上最好的文本编辑器VIM吗?你先得懂得如何在VIM幸存下来,然后一点一点地学习各种戏法. Vim the Six Billion Dollar editor Better, ...

  2. 你必须知道的 34 个简单实用的 Ubuntu 快捷键

      ubuntu常用的快捷键: 1. Ctrl + W: 关闭当前 Nautilus 窗口 2. Ctrl+T: 在 Nautilus 打开新的 Tab 3. Ctrl + H: 切换隐藏文件(夹)显 ...

  3. CRM odata方法 js容易出现的错误,大小写区分 Value Id

    Id Value  注意大小写,I大写,V大写,typeResults.result[0].yt_category.Value; 否则会报 错,Result.yt_businessunit_terri ...

  4. CentOS7配置VNC Server

    CentOS7与6有些许变化,感觉有点不太适应. Step 1: 安装tigervnc server 和 X11 fonts: [root@mdrill ~]# yum install tigervn ...

  5. 关于JPA多数据源的部署persistence.xml文件配置以及对应实现类注入

      <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http: ...

  6. U3D学习使用笔记(三)

    1.对动画进行播放和暂停(从初始位置) (1).老版动画系统Animation 暂停 an["Take 001"].time = 0f; an["Take 001&quo ...

  7. js返回值

    看下js变量.作用域.内存文档. 1. <script type="text/javascript"> function c(){ return 23; } var a ...

  8. C#两路list数组归并去重

    两个相同类型已排序数据进行合并,虽然list数组中有AddRange方法,但它只是把第二个数组从第一个数组末尾插入,假如两个数组有重复数据,保存进去.还有Union方法合并去重,首先会从第一个数组进行 ...

  9. sheelエラー、オブジェクトを解析中にエラーが発生しました。

  10. ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'

    这个错误是说,由于某个SQL操作造成了,表中主键重复. 例子: create table t(x int,y int,z int, primary key(x,y)); insert into t(x ...