uva10405 - Longest Common Subsequence(LIS,最长共同自序列)

题目:uva10405 - Longest Common Subsequence(LIS,最长共同自序列)

题目大意:找出两个字符串中的最长公共的子序列。

解题思路:这类问题是第一次接触,不知道怎么做。百度了一下,发现了递推公式:dp【i】【j】:代表第一个字符串的前i个字符和第二个字符串的前j个字符比较能得到的最长的公共子序列。s【i】 == s【j】 ,dp【i】【j】 = dp【i - 1】【j - 1】 + 1; s【i】 != s【j】 , dp【i】【j】 = Max (dp[i][j - 1], dp[i - 1][j]); 初始化:dp【i】【0】 = dp【0】【j】 = 0; (i
>= 1 && i <= l1[第一个字符串的长度] 、j >= 1 && j <= l2)

相等的话自然是取dp【i - 1】【j - 1】  + 1,因为dp【i- 1】【j】 , dp【i】【j -1】的值一定会小于等于dp【i - 1】【j - 1】  + 1,因为这里i - 1个字符肯定还得花一个字符来和j匹配,这样最优的情况就是dp【i- 2】【j - 1】  +  1,那么dp【i - 1】【j - 1】>=
kdp【i- 2】【j - 1】,因为两个匹配的子串的长度更长,这样相同的字串的长度才会更大。不相等的情况就更容易理解了。

可能会有空串。

代码:

#include <cstdio>
#include <cstring>

const int N = 1005;

char s1[N], s2[N];
int l[N][N];
int l1, l2;

void init () {

	memset (l, 0, sizeof (l));
	l1 = strlen(s1);
	l2 = strlen(s2);
}

int Max (const int a, const int b) { return a > b? a: b; }

int main () {

	while (gets(s1) != NULL) {

		gets (s2);
		init ();

		for (int i = 1; i <= l1; i++)
			for (int j = 1; j <= l2; j++)
				if (s1[i - 1] == s2[j - 1])
					l[i][j] = l[i - 1][j - 1] + 1;
		        else
					l[i][j] = Max (l[i][j - 1], l[i - 1][j]);
		printf ("%d\n", l[l1][l2]);
	}
	return 0;
}

uva10405 - Longest Common Subsequence(LIS,最长共同自序列),布布扣,bubuko.com

时间: 2024-10-03 18:59:07

uva10405 - Longest Common Subsequence(LIS,最长共同自序列)的相关文章

UVA10405 Longest Common Subsequence【LCS+DP】

Given two sequences of characters, print the length of the longest common subsequence of both sequences. ????Sequence 1: ????Sequence 2: ????For example, the longest common subsequence of the following two sequences 'abcdgh' ans 'aedfhr' is 'adh' of

uva 10405 Longest Common Subsequence (最长公共子序列)

uva 10405 Longest Common Subsequence Sequence 1: Sequence 2: Given two sequences of characters, print the length of the longest common subsequence of both sequences. For example, the longest common subsequence of the following two sequences: abcdgh a

最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr

问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj.例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列. 考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bm

POJ 2533 Longest Ordered Subsequence(LIS:最长上升子序列)

http://poj.org/problem?id=2533 题意: 给你一个长度为n的数字序列, 要你求该序列中的最长(严格)上升子序列的长度. 分析: 解法一: O(n^2)复杂度. 令dp[i]==x 表示以第i个数字结尾的上升子序列中最长的为x长度. 初始化: dp[0]=0且dp[i]=1 i>=1时. 状态转移: dp[i] =max( dp[j]+1 ) 其中j<i 且a[j]<a[i]. 最终所求:max(dp[i])  其中1<=i<=n. 解法二: O(n

uva 10405 Longest Common Subsequence(最长公共子序列)

经典的最长公共子序列问题,我刚开始用string敲的,就是为了练练手,没想到竟然wa了,还以为我用错了呢...换了字符数还是wa...真无语,这么简单的题快把我弄糊涂了,后来听人说是输入可能有空格...这是巨坑啊,题上都没说清楚,白白wa了几发...就是设一个数组d[i][j]遍历两个字符数组当a[i]==b[j]的时候d[i][j]=d[i-1][j-1]+1.不相等的时候就是d[i][j]=max(d[i-1][j],d[i][j-1]).别忘了初始化.真坑 代码: #include<ios

【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)

问题描述:序列X={x1,x2,-,xn},Y={y1,y2,-,yn},当Z={z1,z2-,zn}是X的严格递增下标顺序(可以不连续)的子集,也是Y的严格递增下标顺序(可以不连续)的子集,则Z是X和Y的公共子序列.例如X={A,B,C,B,D,A,B},Y={B,D,C,A,B,A},{B,C,A}.{B,C,B,A}.{B,D,A,B}都是X和Y的公共子序列.其中最长的公共子序列叫做Longest common subsequence,即经典的LCS. 具体点:char[]xArray和c

Dynamic Programming | Set 4 (Longest Common Subsequence)

首先来看什么是最长公共子序列:给定两个序列,找到两个序列中均存在的最长公共子序列的长度.子序列需要以相关的顺序呈现,但不必连续.例如,"abc", "abg", "bdf", "aeg", '"acefg"等都是"abcdefg"的子序列.因此,一个长度为n的序列拥有2^n中可能的子序列(序列中的每一个元素只有选或者不选两种可能,因此是2^n). Example: LCS for inp

UVA 10405 Longest Common Subsequence

最长公共子系列,简单的dp,不过注意有空格,所以,在读字符串的时候,尽量用gets读,这样基本没问题 #include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; int dp[1001][1001]; int MAX(int x,int y) { if (x>y) return x; else return y; } int ma

Longest Common Subsequence (DP)

Given two strings, find the longest common subsequence (LCS). Your code should return the length of LCS. Example For "ABCD" and "EDCA", the LCS is "A" (or "D", "C"), return 1. For "ABCD" and &quo