`
cm14k
  • 浏览: 31417 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

动态规划之最长公共子序列

阅读更多

一个给定序列的子序列是在该序列中删去若干元素后得到的序列。若给定序列X={x1, x2, ..., xm},则另一序列Z={z1, z2, ..., zk},X的子序列是指存在一个严格递增下标序列i, 使得对于所用的j=1, 2, 3,...,k有zj = xi.

例如:序列X={A, B, C, B, D, A, B}的一个子序列Z={B, C, D, A}。

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

 

最长公共子序列问题:

给定两个序列X={x1,x2,x3,...,xm}和Y={y1,y2,y3,...,yn},找出X和Y的最长公共子序列

 

动态规划法:

/*
 * 问题描述: 给定两个序列X={x1,x2,x3,...,xm}和Y={y1,y2,y3,...,yn},找出X和Y的最长公共子序列
 * 算法分析:最长公共子序列问题具有最优子结构性质和子问题重叠性质,动态规划法解决
 * 最优值的递归关系:
 * 用c[i][j]记录序列Xi和Yj的最长公共子序列长度
 * 分析:
 * 1)c[i][j] = 0                          i = 0, j = 0;
 * 2)c[i][j] = c[i-1][j-1] + 1            xi = xj;
 * 3)c[i][j] = max{c[i-1][j], c[i][j-1]}  xi != xj
 * 
 * auther:cm
 * date:2010/11/17
 *
 */
public class LcsLength 
{
	private char[] arrX;
	private char[] arrY;
	private int[][] c;

	public LcsLength(String arr1, String arr2)
	{
		arrX = new char[arr1.length() + 1];
		arrY = new char[arr2.length() + 1];
		System.arraycopy(arr1.toCharArray(), 0, arrX, 1, arr1.length());
		System.arraycopy(arr2.toCharArray(), 0, arrY, 1, arr2.length());
		//调用函数
		lcsLength();
	}
	
	//计算最长公共子序列
	public void lcsLength()
	{
		c = new int[arrX.length][arrY.length];
		for (int i = 1; i < arrX.length; i++)
		{
			for (int j = 1; j < arrY.length; j++)
			{
				if (arrX[i] == arrY[j])
				{
					c[i][j] = c[i-1][j-1] + 1;
				}
				else
				{
					c[i][j] = max(c[i-1][j], c[i][j-1]);
				}
			}
		}
	}

	private int max(int m, int n)
	{
		return m > n ? m : n;
	}

	//返回最长子序列
	public String getLCS()
	{
		String lcs = "";
		int i = arrX.length - 1;
		int j = arrY.length - 1;
		while (i >= 1 && j >= 1)
		{
			if (arrX[i] == arrY[j])
			{
				lcs = arrX[i] + lcs;
				i--;
				j--;
			}
			else
			{
				if (c[i][j-1] > c[i-1][j])
				{
					j--;
				}
				else
				{
					i--;
				}
			}
		}
		return lcs;
	}

	public static void main(String[] args) 
	{
		LcsLength lcs = new LcsLength("ABCBDAB", "BDCABA");
		System.out.println(lcs.getLCS());
	}
}

X={A, B, C, B, D, A, B}, Y={B, D, C, A, B, A}.

执行结果:

 

BCBA

 

分享到:
评论

相关推荐

    算法设计与分析实验报告-动态规划寻找最长公共子序列.doc

    总的来说,动态规划在解决最长公共子序列问题时展现了其强大之处,通过优化算法设计,避免了指数级的时间复杂度,实现了线性时间复杂度的高效解决方案。实验报告不仅提升了对动态规划的理解,还锻炼了编程实现和问题...

    动态规划中的最长公共子序列PPT课件.pptx

    动态规划中的最长公共子序列 动态规划中的最长公共子序列是指给定两个序列 X 和 Y,找到他们的最长公共子序列的长度和该子序列本身。该问题是计算机科学中的一类典型问题,广泛应用于数据压缩、数据挖掘、生物信息...

    动态规划——最长公共子序列和最长公共子串之Python实现

    用Python实现动态规划中最长公共子序列和最长公共子串问题!

    动态规划实现最长公共子序列

    利用动态规划 实现排序 找到最长公共工子序列

    最长公共子序列实验报告

    总之,最长公共子序列问题可以通过动态规划有效地解决,通过构建并填充c和b数组,不仅可以得到LCS的长度,还可以重建LCS本身。这种算法的时间复杂度为O(m * n),显著优于指数级的穷举搜索方法。

    最长公共子序列(动态规划)报告.doc

    【最长公共子序列(动态规划)】是一种经典的算法问题,主要应用于序列比对、文本处理等领域。本实验报告详尽地介绍了如何运用动态规划解决这一问题。 动态规划是一种解决复杂问题的有效方法,它通过将大问题分解为...

    动态规划方法求解最长公共子序列代码

    动态规划是一种强大的算法思想,广泛应用于计算机科学,特别是在解决最优化问题时,如寻找最长公共子序列(Longest Common Subsequence, LCS)。本主题聚焦于使用动态规划方法求解最长公共子序列问题,并通过C++语言...

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

    动态规划算法求最长公共子序列 动态规划算法是一种常用的算法思想,它通过将复杂的问题分解成多个小问题,并将这些小问题的解组合起来,来解决复杂的问题。在这里,我们使用动态规划算法来求解最长公共子序列问题。...

    最长公共子序列动态规划算法

    ### 最长公共子序列动态规划算法 在计算机科学领域中,**最长公共子序列问题**(Longest Common Subsequence Problem, LCS)是一个经典的算法问题,它主要应用于文本比较、生物信息学中的DNA序列比对等领域。该问题...

    奥赛动态规划法最长公共子序列

    接下来的LCSLength函数实现这个动态规划过程,而LCS函数则用于根据存储的c数组回溯并打印出最长公共子序列。在算法的改进部分,我们注意到数组b实际上是可以省略的,因为c[i][j]的值仅取决于c[i-1][j-1]、c[i-1][j]...

    最长公共子序列问题 动态规划

    最长公共子序列(动态规划) 实验数据:input.txt X={A,B,C,B,D,A,B}; Y={B,D,C,A,B,A} ——要求给出X、Y的最长公共子序列Z,程序运行结束时,将计算结果输出到文件output.txt中。输出文件中包含问题的答案:找不到...

    实验2. 动态规划法求解最长公共子序列问题与0-1背包问题.doc

    动态规划法求解最长公共子序列问题与0-1背包问题 本实验报告旨在通过动态规划法解决最长公共子序列问题和0-1背包问题,以深入理解动态规划方法的思想、求解策略及步骤。 实验目的 * 理解动态规划方法的核心思想和...

    动态规划求解最长公共子序列

    关于动态规划求解最长公共子序列的方法,讲得蛮清楚的。

    动态规划法解最长公共子序列

    1. 要求按动态规划法原理求解问题; 2. 两个序列数据通过键盘输入; 3. 要求显示结果。

    动态规划求最长公共子序列

    总结一下,这个程序使用动态规划求解最长公共子序列问题,通过一个二维数组存储中间状态,实现了从无到有逐步构造LCS的过程。动态规划的优势在于它避免了重复计算,使得复杂度降低到O(mn),其中m和n分别是两个输入...

    实验2. 动态规划法求解最长公共子序列问题&0-1背包问题.doc

    “动态规划法求解最长公共子序列问题&0-1背包问题” 动态规划是一种非常重要的算法设计方法,应用于解决很多复杂的问题。动态规划法可以将问题分解成若干个小问题,然后通过解决每个小问题来解决整个问题。在实验2...

    C#实现-动态规划-最长公共子序列-DPLCS

    本主题聚焦于使用C#语言实现动态规划来求解“最长公共子序列”(Longest Common Subsequence,简称LCS)问题。最长公共子序列是指两个或多个字符串中的一个非空子序列,它在原序列中保持原有的相对顺序,但不一定...

    最长公共子序列_动态规划

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一种经典的字符串问题,主要涉及算法设计与分析,特别是在动态规划领域的应用。在这个问题中,我们需要找到两个或多个字符串之间的最长子序列,这...

    最长公共子序列的动态规划算法

    最长公共子序列(Longest Common Subsequence,LCS)问题是一个经典的计算机科学问题,主要涉及字符串处理和动态规划算法。在本场景中,我们使用C#编程语言来解决这个问题。C#是一种多范式编程语言,广泛应用于开发...

    动态规划最长公共子序列

    动态规划最长公共子序列(Longest Common Subsequence, LCS)是计算机科学中一个经典的问题,主要涉及算法设计和分析。在本场景中,我们聚焦于使用动态规划方法解决这一问题。最长公共子序列是指两个或多个序列中,...

Global site tag (gtag.js) - Google Analytics