实验二 动态规划算法 最长公共子序列问题
基本题一:最长公共子序列问题
一、实验目的与要求
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,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,则
(1)若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。
(2)若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。(即:Z是X序列中前m个元素所组成的序列与Y序列的最长公共子序列)
(3)若xm≠yn且zk≠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
实验二 动态规划算法 最长公共子序列问题相关推荐
- 动态规划算法——最长公共子序列求法
给定序列X={ X1,X2,....Xn }.Y={ Y1,Y2,...Ym }找出它们的最大子序列Z={ Z1,Z2,...Zk }比如:X={ A,B ,C,B,D,A,B }.Y={ B,D,C ...
- javascript写算法(一) 动态规划:最长公共子序列
csdn是疯了吗,右下角的广告是一个人站在猪屁股后面打它...看了一下居然是baidu算出来的广告嵌在了iframe里,fixed to viewport,真是够了.最近还频频出现的广告是一个光头男子 ...
- c语言最长公共子序列_序列比对(二十四)——最长公共子序列
原创: hxj7 本文介绍如何求解两个字符串的最长公共子序列. 最长公共子序列问题 前文<序列比对(二十三)--最长公共子字符串>介绍了如何求解两个字符串的最长公共子字符串,本文将介绍如何 ...
- 动态规划解最长公共子序列(LCS)(附详细填表过程)
目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...
- 动态规划解决最长公共子序列
动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...
- 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...
动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...
- 算法分析与设计-实验二 动态规划算法设计
文章目录 1. 数字三角问题 2.最长公共子序列问题 3.日常购物 4.台阶问题 一.实验目的: 掌握动态规划算法的基本思想及适用条件,掌握动态规划算法的设计步骤和具体实现. 二.实验所用仪器及环境 ...
- 【动态规划】最长公共子序列与最长公共子串
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 动态规划解决方案最长公共子序列问题(开启)
动态规划 常常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地採用把大问题分解成子问题.并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数添加. 为 ...
最新文章
- 各系统QT安装ROS后不显示src问题
- wps定位对话框快捷键_F1~F12快捷键,高效办公的12个方法
- UDF、UDAF、UDTF函数编写
- C++为什么空格无法输出_C 语言 第8章-字符输入/输出和输入验证
- Eclipse中导入外部jar包
- Python(3):组的概念
- arduino 土壤温湿度传感器_嫌arduino太贵?太大?试试ATTINY85!DIY温湿度计入门级教程...
- rails mysql查询_rails 对数据库的一些操作:新增,查询等
- 屌丝就爱尝鲜头——java8再判断
- vsftpd虚拟用户使用实验报告
- 数组成员是函数java_在Laravel 5.6中调用数组上的成员函数links()
- 文件已被占用的解决方法
- 3 个很酷的 Python 库,可以节省您的时间和精力
- win7计算机窗口无法最小化,Windows7系统任务栏不显示最小化窗口的解决方法
- 3万字报告拆解:硅谷寒冬,投资人还在哪些赛道烧钱?|我在硅谷看未来
- 小学作文批改评语大全
- mq消费的几种方式(从消费者角度出发)
- windows服务器无法安装net3.5 提示:无法通过windows功能控制面板自动安装或卸载windows server角色和功能服务器
- socket.io实现聊天功能——第一章 、群聊
- Jihad 2.0下载,Jihad 下载,“圣战”2.0版下载,Jihad 介绍,“圣战”DDOS攻击工具
热门文章
- 华硕z97不识别m2固态_固态盘M.2、SATA有这样的差别,难怪大家都选“它”
- docker 安装hadoop
- pytorch torch.transpose
- python yield
- mysql 字段操作
- 16 The Terminal and Job Control
- php 修改cache数据,修改ThinkPHP缓存为Memcache的方法
- python特征数据类型及常用操作对比_更高效的利用Jupyter+pandas进行数据分析,6种常用数据格式效率对比!...
- 职场精英修炼必学工具:75页自我管理的29个工具,系统方法论
- 如何使用 vSphere Certificate Manager 替换 SSL 证书 (2097936)