基本题一:最长公共子序列问题

一、实验目的与要求

1、熟悉最长公共子序列问题的算法;

2、初步掌握动态规划算法;

二、实验题

若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。

给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。

给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

三、实验提示

include "stdlib.h"
#include "string.h"void LCSLength(char *x ,char *y,intm,int n, int **c, int **b)
{inti ,j;for (i = 1; i<= m; i++) c[i][0] = 0;for (i = 1; i<= n; i++) c[0][i] = 0;for (i = 1; i<= m; i++)for (j = 1; j <= n; j++){if (x[i]==y[j]){c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}else if (c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j];b[i][j]=2;}else{    c[i][j]=c[i][j-1];b[i][j]=3;}}
}
void LCS(inti ,int j, char *x ,int **b)
{if (i ==0 || j==0) return;if (b[i][j]== 1){LCS(i-1,j-1,x,b);printf("%c",x[i]);}else if (b[i][j]== 2)LCS(i-1,j,x,b);else LCS(i,j-1,x,b);
}

四、题目分析

在求最长公共子序列中,我们可以看出如下规律:

设序列X={x1,x2,&hellip;,xm}和Y={y1,y2,&hellip;,yn}的最长公共子序列为Z={z1,z2,&hellip;,zk} ,则

(1)若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。

(2)若xm&ne;yn且zk&ne;xm,则Z是xm-1和Y的最长公共子序列。(即:Z是X序列中前m个元素所组成的序列与Y序列的最长公共子序列)

(3)若xm&ne;yn且zk&ne;yn,则Z是X和yn-1的最长公共子序列。(即:Z是Y序列中前n个元素所组成的序列与X序列的最长公共子序列)

由上面三个条件可得如下公式:

C[][]用来记录最长公共子序列的长度,则:

c[i][j] = <1> 0;                   (当i、j = 0时);

<2> c[i-1][j-1] + 1;        (当i、j > 0 且 Xi = Yj时)(即第i个X序列元素与第j个Y元素相等)

<3> max(c[i][j-1] , c[i-1][j])       (当i、j > 0 且 Xi != Yj时)(当Xi与Yj不等时,取两个式子的最大值,若两者相等则默认取第一个)

五,源代码

importjava.util.*;
import java.io.*;public class LCS
{public static void main(String[] args) {  String s1 = "ABCBDAB";  String s2 = "BDCABA";  LCS cms = new LCS();  String[] x = cms.init(s1);  String[] y = cms.init(s2);  int[][] b = new int[x.length][y.length];  System.out.println("最大子序列的长度为:"+lcsLength(x, y, b));  System.out.println("最大子序列为:");  lcs(x.length-1, y.length-1, x, b);} public static void lcs(inti, int j, String[] x, int[][] b) {  if (i == 0 || j == 0)  return;  if (b[i][j] == 1) {  lcs(i - 1, j - 1, x, b);  System.out.print(x[i]+"  ");  } else if (b[i][j] == 2)  lcs(i - 1, j, x, b);  elselcs(i, j - 1, x, b);  }  private String[] init(String str){  String temp = str;  String[] s = temp.split("");  return s;  }public static intlcsLength(String[] x, String[] y, int[][] b) {  int m = x.length - 1;  int n = y.length - 1;  int[][] c = new int[m + 1][n + 1];  for (inti = 1; i<= m; i++){  c[i][0] = 0;  }  for (inti = 1; i<= n; i++)  c[0][i] = 0;  for (inti = 1; i<= m; i++) {  for (int j = 1; j <= n; j++) {  if (x[i].equals(y[j])) {  c[i][j] = c[i - 1][j - 1] + 1;  b[i][j] = 1;  } else if (c[i - 1][j] >= c[i][j - 1]) {  c[i][j] = c[i - 1][j];  b[i][j] = 2;   } else {  c[i][j] = c[i][j - 1];  b[i][j] = 3;  }  }  }  return c[m][n];  }
}

结果:

转载于:https://blog.51cto.com/qiangmzsx/824842

实验二 动态规划算法 最长公共子序列问题相关推荐

  1. 动态规划算法——最长公共子序列求法

    给定序列X={ X1,X2,....Xn }.Y={ Y1,Y2,...Ym }找出它们的最大子序列Z={ Z1,Z2,...Zk }比如:X={ A,B ,C,B,D,A,B }.Y={ B,D,C ...

  2. javascript写算法(一) 动态规划:最长公共子序列

    csdn是疯了吗,右下角的广告是一个人站在猪屁股后面打它...看了一下居然是baidu算出来的广告嵌在了iframe里,fixed to viewport,真是够了.最近还频频出现的广告是一个光头男子 ...

  3. c语言最长公共子序列_序列比对(二十四)——最长公共子序列

    原创: hxj7 本文介绍如何求解两个字符串的最长公共子序列. 最长公共子序列问题 前文<序列比对(二十三)--最长公共子字符串>介绍了如何求解两个字符串的最长公共子字符串,本文将介绍如何 ...

  4. 动态规划解最长公共子序列(LCS)(附详细填表过程)

    目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...

  5. 动态规划解决最长公共子序列

    动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...

  6. 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...

    动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...

  7. 算法分析与设计-实验二 动态规划算法设计

    文章目录 1. 数字三角问题 2.最长公共子序列问题 3.日常购物 4.台阶问题 一.实验目的: 掌握动态规划算法的基本思想及适用条件,掌握动态规划算法的设计步骤和具体实现. 二.实验所用仪器及环境 ...

  8. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  9. 动态规划解决方案最长公共子序列问题(开启)

     动态规划 常常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地採用把大问题分解成子问题.并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数添加. 为 ...

最新文章

  1. 各系统QT安装ROS后不显示src问题
  2. wps定位对话框快捷键_F1~F12快捷键,高效办公的12个方法
  3. UDF、UDAF、UDTF函数编写
  4. C++为什么空格无法输出_C 语言 第8章-字符输入/输出和输入验证
  5. Eclipse中导入外部jar包
  6. Python(3):组的概念
  7. arduino 土壤温湿度传感器_嫌arduino太贵?太大?试试ATTINY85!DIY温湿度计入门级教程...
  8. rails mysql查询_rails 对数据库的一些操作:新增,查询等
  9. 屌丝就爱尝鲜头——java8再判断
  10. vsftpd虚拟用户使用实验报告
  11. 数组成员是函数java_在Laravel 5.6中调用数组上的成员函数links()
  12. 文件已被占用的解决方法
  13. 3 个很酷的 Python 库,可以节省您的时间和精力
  14. win7计算机窗口无法最小化,Windows7系统任务栏不显示最小化窗口的解决方法
  15. 3万字报告拆解:硅谷寒冬,投资人还在哪些赛道烧钱?|我在硅谷看未来
  16. 小学作文批改评语大全
  17. mq消费的几种方式(从消费者角度出发)
  18. windows服务器无法安装net3.5 提示:无法通过windows功能控制面板自动安装或卸载windows server角色和功能服务器
  19. socket.io实现聊天功能——第一章 、群聊
  20. Jihad 2.0下载,Jihad 下载,“圣战”2.0版下载,Jihad 介绍,“圣战”DDOS攻击工具

热门文章

  1. 华硕z97不识别m2固态_固态盘M.2、SATA有这样的差别,难怪大家都选“它”
  2. docker 安装hadoop
  3. pytorch torch.transpose
  4. python yield
  5. mysql 字段操作
  6. 16 The Terminal and Job Control
  7. php 修改cache数据,修改ThinkPHP缓存为Memcache的方法
  8. python特征数据类型及常用操作对比_更高效的利用Jupyter+pandas进行数据分析,6种常用数据格式效率对比!...
  9. 职场精英修炼必学工具:75页自我管理的29个工具,系统方法论
  10. 如何使用 vSphere Certificate Manager 替换 SSL 证书 (2097936)