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最长共同子序列的更多相关文章

  1. 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...

  2. POJ 1458 Common Subsequence(LCS最长公共子序列)

    POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...

  3. 动态规划模板2|LCS最长公共子序列

    LCS最长公共子序列 模板代码: #include <iostream> #include <string.h> #include <string> using n ...

  4. LCS 最长公共子序列

    区别最长公共子串(连续) ''' LCS 最长公共子序列 ''' def LCS_len(x, y): m = len(x) n = len(y) dp = [[0] * (n + 1) for i ...

  5. LCS最长公共子序列(最优线性时间O(n))

    这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:h ...

  6. LCS最长公共子序列

    问题:最长公共子序列不要求所求得的字符串在所给字符串中是连续的,如输入两个字符串ABCBDAB和BDCABA,字符串BCBA和BDAB都是他们的公共最长子序列 该问题属于动态规划问题 解答:设序列X= ...

  7. LCS最长公共子序列HDU1159

    最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...

  8. POJ 2250(LCS最长公共子序列)

    compromise Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Descri ...

  9. LCS最长公共子序列~dp学习~4

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...

  10. Atcoder F - LCS (DP-最长公共子序列,输出字符串)

    F - LCS Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement You are gi ...

随机推荐

  1. Android 查看自己的keystore的别名及相关信息

    1.在DOS窗口下进入自己的keystore所在位置,输入 keytool -list  -v -keystore xxxx.keystore -storepass 密码 xxxx.keystore是 ...

  2. python 字符串的格式化

    python字符串的格式化分为两种:1)% 方式    2)str.format()  方式. str.format() 是比 % 较新的方式, 大多数的 Python 代码仍然使用 % 操作符.但最 ...

  3. jmeter使用代理服务器录制脚本端口号被占用

    初学jmeter工具,在设置端口号时,使用8080,IE设置的局域网端口也为8080,启动代理服务器时,提示:Could not create script recorder-port in use. ...

  4. 内存检查工具Valgrind

    官网介绍:http://www.valgrind.org/ Valgrind is an instrumentation framework for building dynamic analysis ...

  5. 工作笔记——web字体格式转换

    转载自:http://blog.csdn.net/xiaolongtotop/article/details/8316554 目前,文字信息仍是网站最主要的内容,随着CSS3技术的不断成熟,Web字体 ...

  6. Java游戏服务器成长之路——弱联网游戏篇(源码分析)

    前言 前段时间由于公司的一款弱联网游戏急着上线,没能及时分享,现在基本做的差不多,剩下的就是测试阶段了(本来说元旦来分享一下服务器技术的).公司的这款游戏已经上线一年多了,在我来之前一直都是单机版本, ...

  7. JAVA中的反射机制 (转)

    反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本 ...

  8. 【PS技巧】创建2D对象的描边阴影

    在本场景中,怪物死亡掉落宝袋.所以在玩家眼里,宝袋是掉落在场景里,而不是像其他界面的UI元素,悬浮在场景上的. 所以,我们需要给宝袋添加阴影,增加它与场景之间的视觉过渡,比较简单的办法是使用阴影,正如 ...

  9. webpack打包静态资源和动态资源

    1.对于静态引用的资源: <img src = "static/modelname/imgname.png"> // 修改为下面的写法 <img src = &q ...

  10. 什么是Socket?简单点,通俗易懂的?

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...