LCS最长共同子序列
2017-09-02 15:06:57
writer:pprp
状态表示:
f(n,m)表示s1[0..n]和s2[0..m]
从0开始计数,最终结果是f(N-1,M-1)
考虑四种情况:
1/ s1[n] == s2[m] : f(n,m) = f(n-1,m-1)+1;
2/ s1[n]是LCS的一部分,
3/ s2[m]是LCS的一部分,
4/ s1[n]和s2[m]都不是LCS的一部分
状态转移:
if(s1[n] == s1[m])
f(n,m) = max(f(n-1,m-1)+1,f(n-1,m),f(n,m-1),f(n-1,m-1));
f(n-1,m-1) 只可能小于 f(n-1,m-1)+1
f(n,m-1)顶多跟f(n-1,m-1)+1的值相同,f(n-1,m)也是同理
所以直接就是f(n-1,m-1)+1;
if(s1[n] != s2[m])
f(n,m) = max(f(n-1,m),f(n,m-1),f(n-1,m-1))
已知f(n-1,m-1)小于等于f(n-1,m)
最后状态为f(n,m) = max(f(n-1,m),f(n,m-1));
结果在上边已经分析过了
代码如下:两种都是对的,不同的表达方式而已;
/*
@theme:最长公共子序列
@writer:pprp
@begin:15:37
@end:16:29
@declare:LCS
@error:从1开始读入的话,用strlen也要从1开始测才可以
@date:2017/9/2
*/ #include <bits/stdc++.h> using namespace std; char s1[],s2[];
int dp[][]; /*
状态表示:f(n,m)表示s1[0..n]和s2[0..m]
从0开始计数,最终结果是f(N-1,M-1)
考虑四种情况:
1/ s1[n] == s2[m] : f(n,m) = f(n-1,m-1)+1;
2/ s1[n]是LCS的一部分,
3/ s2[m]是LCS的一部分,
4/ s1[n]和s2[m]都不是LCS的一部分
状态转移:
if(s1[n] == s1[m])
f(n,m) = max(f(n-1,m-1)+1,f(n-1,m),f(n,m-1),f(n-1,m-1));
f(n-1,m-1) 只可能小于 f(n-1,m-1)+1
f(n,m-1)顶多跟f(n-1,m-1)+1的值相同,f(n-1,m)也是同理
所以直接就是f(n-1,m-1)+1;
if(s1[n] != s2[m])
f(n,m) = max(f(n-1,m),f(n,m-1),f(n-1,m-1))
已知f(n-1,m-1)小于等于f(n-1,m)
最后状态为f(n,m) = max(f(n-1,m),f(n,m-1));
结果在上边已经分析过了
*/ int main()
{
// freopen("in.txt","r",stdin);
//从0开始
while(~scanf("%s%s",s1+,s2+))
{
memset(dp,,sizeof(dp)); int n = strlen(s1+);
int m = strlen(s2+); for(int i = ; i <= n ; i++)
{
for(int j = ; j <= m ; j++)
{
if(s1[i] == s2[j])
dp[i][j] = dp[i-][j-]+;
else
dp[i][j] = max(dp[i-][j],dp[i][j-]);
}
}
cout << dp[n][m] << endl;
}
return ;
} /*
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%s%s",s1+1,s2+1))
{
memset(dp,0,sizeof(dp));
int i,j;
for(i = 1; s1[i] ; i++)
{
for(j = 1; s2[j]; j++)
{
if(s1[i] == s2[j])
dp[i][j] = dp[i-1][j-1]+1;
else
dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
}
}
cout << dp[i-1][j-1] << endl;
}
}
*/
LCS最长共同子序列的更多相关文章
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
- POJ 1458 Common Subsequence(LCS最长公共子序列)
POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...
- 动态规划模板2|LCS最长公共子序列
LCS最长公共子序列 模板代码: #include <iostream> #include <string.h> #include <string> using n ...
- LCS 最长公共子序列
区别最长公共子串(连续) ''' LCS 最长公共子序列 ''' def LCS_len(x, y): m = len(x) n = len(y) dp = [[0] * (n + 1) for i ...
- LCS最长公共子序列(最优线性时间O(n))
这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:h ...
- LCS最长公共子序列
问题:最长公共子序列不要求所求得的字符串在所给字符串中是连续的,如输入两个字符串ABCBDAB和BDCABA,字符串BCBA和BDAB都是他们的公共最长子序列 该问题属于动态规划问题 解答:设序列X= ...
- LCS最长公共子序列HDU1159
最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...
- POJ 2250(LCS最长公共子序列)
compromise Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descri ...
- LCS最长公共子序列~dp学习~4
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...
- Atcoder F - LCS (DP-最长公共子序列,输出字符串)
F - LCS Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement You are gi ...
随机推荐
- 设计模式之Factory工厂模式
在上一章,模板模式中,我们在父类规定处理的流程,在子类中实现具体的处理.如果我们将该模式用于生成实例,便演变成了Factory模式,即工厂模式. 在Factory模式中,父类决定实例的生成方式,但并不 ...
- flask中的blueprint
https://blog.csdn.net/sunhuaqiang1/article/details/72803336
- python学习笔记(四)— 补充
函数return多个值 函数如果有多个return值,那么会生成一个元组里面 def hello(a,b,c,d): return a,b,c,d res =hello('aa','cc','dd', ...
- 网络爬虫值scrapy框架基础
简介 Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. 其可以应用在数据挖掘,信息处理或存储历史 ...
- Python的编码问题(一)
一.什么是编码 可以说,计算机是一个即聪明又笨蛋的家伙.说它聪明,是因为他可以做很多事情,它的强大无需多说,大家应该都有所了解以及感受.但是为什么说它又是个笨蛋呢,因为我们在电脑上写出的每一个字,保存 ...
- MyEclipse 10的使用技巧
默认快捷键 :Shift+Alt+s 然后选择generater getter and setter,这是快捷键.或者右键source里边有 generater getter and setter. ...
- 002-Spring Boot将WAR文件部署到Tomcat
一.概述 springboot 带有内置Tomcat 服务器,可以直接将项目打包成jar运行,如果在需要把项目打成war包,使用外置tomcat部署.下面是将springboot项目部署为war项目的 ...
- 联想yoga table2 1371f 进入bios 的巧妙方法
win8.1 的平板,无键盘,触屏失灵,接了个鼠标 我在这里向大家介绍最后一个方法<ignore_js_op>▲在metro界面下找到设置选项 <ignore_js_op> ...
- SAP Idoc 事务码
SALE Display ALE Customizing SM59 RFC Destinations (Display/Maintain) BD64 Maintenance of Distributi ...
- 编写Avocado测试
编写Avocado测试 现在我们开始使用python编写Avocado测试,测试继承于avocado.Test. 基本例子 创建一个时间测试,sleeptest,测试非常简单,只是sleep一会: i ...