DP算法---最长公共子序列

原创 2016年06月01日 18:47:24

#include"stdio.h"
#include"string.h"

main()
{
	char str1[100],str2[100];
	int dp[100][100]={0};
	int i,j,len1,len2;
	gets(str1);
	gets(str2);
	len1=strlen(str1);
	len2=strlen(str2);
	for(i=1;i<=len1;i++)				//str1为主串,str2为副串 
	{
		for(j=1;j<=len2;j++)
		{
			if(str1[i-1]==str2[j-1])			//相同保留上一次的最大长度,而上一次指的就是就是i-1和j-1 
			{
				dp[i][j]=dp[i-1][j-1]+1;
			}
			else
			{
				if(dp[i-1][j]>=dp[i][j-1])			//不同判断是i-1的长度大,j-1的长度大,判断dp[i-1][j]和dp[i][j-1]哪个大,找出大的放进dp[i][j] 
				{
					dp[i][j]=dp[i-1][j];
				}
				else
				{
					dp[i][j]=dp[i][j-1];
				}
			}
		}
	}
	printf("%d\n",dp[len1][len2]);
}

一、题意:求两个字符串的最长公共子序列

二、状态转移方程:

    if(i==0||j==0) dp[i,j]=0;

    else if (x[i]==y[j])  dp[i,j]=dp[i-1][j-1];

    else dp[i,j]=max{dp[i-1][j],dp[i][j-1]};

三、字符规定:

    dp[i,j]表示x的前面i个字符和y的前面j个字符所构成的最长公共子序列的长度。 

    dp[i-1,j-1]表示x的前面i-1个字符和y的前面j-1个字符所构成的最长公共子序列的长度。 

    dp[i-1,j]表示x的前面i个字符和y的前面j个字符所构成的最长公共子序列的长度。 

    dp[i,j-1]表示x的前面i个字符和y的前面j-1个字符所构成的最长公共子序列的长度。

 四、思路

       将x和y字符使用二维数组存放,初始化边界;以x为主串与y为子串进行比较。

       当x[i]==y[j],表示x[i]与y[j]可以构成一个LCS(最长公共子序列),这个时候dp[i,j]=dp[i-1][j-1],因为可能x的前i-1个字符会与y的前1、2、3。。。j-1构成LCS,利用dp的思想我们在前面构成的LCS的基础上加一,即dp[i,j]=dp[i-1][j-1]。


       当x[i]!=y[j]时,这时dp[i,j]=max{dp[i-1][j],dp[i][j-1]},因为x的前i-1个字符与y的前j构成的LCS与x的前i个字符与y的前j-1构成的LCS可能是不同LCS,因此我们取其中的最大值延续到dp[i,j]中,即dp[i,j]=max{dp[i-1][j],dp[i][j-1]}。


二维数组的存放和模拟过程如下:


第一次写DP的题,思路和表达不是很好。如有错误的地方,欢迎指出。+-+。。。

最长公共子序列(LCS问题)的DP解法

呃。。大一做过,毕竟是ACM入门DP题,但是大三的我已然忘了具体咋做了,只记得是DP,面试常会问这个问题,所以有必要搞明白。 题目描述略。 解题思想就是DP,DP无外乎需要知道两个东西,一是状态是什么...
  • u013303743
  • u013303743
  • 2016年04月23日 10:40
  • 810

LCS 最长公共子序列(DP经典问题)

最长公共子序列问题以及背包问题都是DP(动态规划)算法的经典题目,值得深度挖掘以致了解DP算法思想。问题如下: 最长公共子序列 时间限制:3000 ms  |  内存限制:6553...
  • u014492609
  • u014492609
  • 2014年08月08日 15:48
  • 1288

算法练习之DP 求LCM (最长公共子序列)

算法练习之DP 求LCM (最长公共子序列)
  • csharp25
  • csharp25
  • 2015年06月24日 10:48
  • 1282

最长公共子序列(dp)

描述 我们称序列Z = 1, z2, ..., zk >是序列X = 1, x2, ..., xm >的子序列当且仅当存在 严格上升 的序列1, i2, ..., ik >,使得对j = 1, 2,...
  • hz18790581821
  • hz18790581821
  • 2016年07月31日 17:02
  • 578

[dp]最长公共子序列问题

最长公共子序列问题 给定两个字符串s1s2…sn和t1t2…tn。求出这两个字符串最长的公共子序列的长度. 限制条件:1 输入: n = 4 m = 4 s = "abcd" t...
  • u012848631
  • u012848631
  • 2015年05月25日 17:48
  • 317

【算法设计与分析】5、最长公共子序列

/** * 书本:《算法分析与设计》 * 功能:若给定序列X={x1, x2, ..., xm},则另一序列Z={z1, z2, ..., zk},是X的子序列是指存在一个严格递增下标序列{i1, i...
  • cutter_point
  • cutter_point
  • 2014年12月07日 19:01
  • 821

bzoj 2423: [HAOI2010]最长公共子序列 (DP)

题目描述传送门题目大意:求最长上升子序列及个数题解第一问O(n^2)直接转移就可以。 f[i][j]=max(f[i−1][j],f[i][j−1])  s[i]!=s1[j]f[i][j]=max...
  • clover_hxy
  • clover_hxy
  • 2017年06月09日 16:48
  • 210

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

一、问题描述 求两个字符序列的公共最长子序列。例如字符序列abcbdb和字符序列acbbabdbb的最长公共子序列为acbdb。 二、问题分析 用L[i][j]表示子序列xi和yj的最长公共子序列的长...
  • tterminator
  • tterminator
  • 2016年03月24日 16:56
  • 5224

最长公共子序列的Nakatsu算法的体会与改进

最长公共子序列的Nakatsu算法的体会与改进   最长公共子序列(Longest Common Subsequence,LCS)是将两个给定字符串分别删去零个或多个字符后得到的长度最长的相同字符序列...
  • whchensir
  • whchensir
  • 2014年04月02日 22:26
  • 743

最长公共子序列(易理解)

最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序...
  • amazingcode
  • amazingcode
  • 2016年06月16日 20:09
  • 1901
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DP算法---最长公共子序列
举报原因:
原因补充:

(最多只允许输入30个字)