sicily LCS

直接用递归做了一下,超时了,可能要再加上记忆化搜索?不会...

然后再用动态规划就过了...

http://soj.sysu.edu.cn/show_problem.php?pid=1002&cid=1762

 1 //直接递归,tle
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5
 6 using namespace std;
 7
 8 char s1[1001];
 9 char s2[1001];
10
11 int LCS(char s1[], char s2[], int len1, int len2)
12 {
13     if(len1 == 0 || len2 == 0)
14         return 0;
15     if(s1[len1-1] == s2[len2-1])
16         return 1+LCS(s1, s2, len1-1, len2-1);
17     else
18         return max(LCS(s1, s2, len1-1, len2), LCS(s1, s2, len1, len2-1));
19 }
20
21 int main()
22 {
23     while(cin >> s1 >> s2)
24     {
25         int len1 = strlen(s1);
26         int len2 = strlen(s2);
27         cout << LCS(s1, s2, len1, len2) << endl;
28     }
29     return 0;
30 }
 1 //动规,思路是一样的
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5
 6 using namespace std;
 7
 8 char s1[1001];
 9 char s2[1001];
10 int dp[1001][1001];
11
12 int LCS(char s1[], char s2[])
13 {
14     int len1 = strlen(s1);
15     int len2 = strlen(s2);
16     memset(dp, 0, sizeof(dp));
17
18     for(int i=1; i<=len1; i++)
19     {
20         for(int j=1; j<=len2; j++)
21         {
22             if(s1[i-1] == s2[j-1])
23                 dp[i][j] = dp[i-1][j-1] + 1;
24             else
25                 dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
26         }
27     }
28     return dp[len1][len2];
29 }
30
31 int main()
32 {
33     while(cin >> s1 >> s2)
34     {
35         cout << LCS(s1, s2) << endl;
36     }
37     return 0;
38 }
时间: 2024-10-11 22:45:07

sicily LCS的相关文章

HDU 1513 Palindrome:LCS(最长公共子序列)or 记忆化搜索

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 题意: 给你一个字符串s,你可以在s中的任意位置添加任意字符,问你将s变成一个回文串最少需要添加字符的个数. 题解1(LCS): 很神奇的做法. 先求s和s的反串的LCS,也就是原串中已经满足回文性质的字符个数. 然后要变成回文串的话,只需要为剩下的每个落单的字符,相应地插入一个和它相同的字符即可. 所以答案是:s.size()-LCS(s,rev(s)) 另外,求LCS时只会用到lcs[i-

poj 1080 (LCS变形)

Human Gene Functions 题意: LCS: 设dp[i][j]为前i,j的最长公共序列长度: dp[i][j] = dp[i-1][j-1]+1;(a[i] == b[j]) dp[i][j] = max(dp[i][j-1],dp[i-1][j]); 边界:dp[0][j] = 0(j<b.size) ,dp[i][0] = 0(i< a.size); LCS变形: 设dp[i][j]为前i,j的最大价值: value(x, y)为比较价值: dp[i][j] = max(d

POJ 1080 Human Gene Functions(LCS)

Description It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four letters, A, C, G, and T. Biologists have been interested in identifying human genes and determining their

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

最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列:也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续. 1.序列str1和序列str2 ·长度分别为m和n: ·创建1个二维数组L[m.n]: ·初始化L数组内容为0 ·m和n分别从0开始,m++,n++循环: - 如果str1[m] ==

hdu 1503 LCS输出路径【dp】

hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左走.我用1表示向上走,2向左上方走,3向左走. 刚开始输入字符串时有两种方法,直接输入:或从地址后一位输入,即此时数组起始编号为1.直接输入时,dp[i][j]表示的是以s1[i-1],s2[j-1]为结尾LCS,另一种则就是表示以s1[i],s2[j]为结尾的LCS.两者在路径输出时有些差别,以前

hdu1159 poj1458 LCS裸题

HDU 1159 题意:找LCS 思路:裸题 n*m的写法,我的写法好像比较奇怪...用一个ci保存s2第i位可以做为s1的公共子序列的最大值,s1的每一位遍历s2,遍历的时候记录前面出现过的ci的最大值,ci一定是一个连序的上升序列,我的好像不是正经的LCS的算法,改天还是要学习一个的 AC代码: #include "iostream" #include "string.h" #include "stack" #include "qu

hdu-1159 Common Subsequence (dp中的lcs问题)

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 38425    Accepted Submission(s): 17634 Problem Description A subsequence of a given sequence is the given sequence with some el

最长公共子序列LCS (DP)

题意: 求两个字符串的公共子序列,如"abcd" 与 "becd"的公共子序列是 "bcd" 分析: 设两个字符串为 串s 和串tdp[i][j]:= s1..si和t1...tj对应的LCS长度 那么 dp[i][j] = { 0                     ,   i =0 or j = 0; dp[i-1][j-1] + 1,   i ,j > 0 and si = tj; max(dp[i-1][j] , dp[i][j

LCS问题

LCS问题即longest common subsequence problem,中文:最长公共子序列问题 给你两个字符串str1和str2,它们之间可能存在公有子序列,子序列和子串的区别是:子序列不要求连续,只需要按照顺序出现就好,子串则要求连续: 例如:SIMPLE和NAIVE有共同的子序列IE,但是没有共同的子串. TOO SIMPLE和TOO YOUNG则有共同子串TOO LCS问题就是(1)求出最长公有子序列的长度(2)求出最长公有子序列. (1) 求出最长公有子序列的长度 解法考虑动