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. 【chainer框架】【pytorch框架】

    教程: https://bennix.github.io/ https://bennix.github.io/blog/2017/12/14/chain_basic/ https://bennix.g ...

  2. Python性能优化(转)

    分成两部分:代码优化和工具优化 原文:http://my.oschina.net/xianggao/blog/102600 阅读 Zen of Python,在Python解析器中输入 import ...

  3. SQL Server扩展事件-- 使用system_health默认跟踪会话监控死锁

    SQL Server扩展事件(Extended Events)-- 使用system_health默认跟踪会话监控死锁 转自:http://blog.51cto.com/ultrasql/160037 ...

  4. JavaScript Object.defineProperty()方法详解

    Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法 Object.defineProperty(obj, prop ...

  5. python 之操作mysql 数据库实例

    对于python操作mysql 数据库,具体的步骤应为: 1. 连接上mysql host 端口号 数据库 账号 密码2. 建立游标3. 执行sql(注意,如果是update,insert,delet ...

  6. PKU 3169 Layout(差分约束系统+Bellman Ford)

    题目大意:原题链接 当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些.FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食.奶牛排在队伍中的顺序和它们的编号是相同的 ...

  7. 64. Minimum Path Sum(最小走棋盘 动态规划)

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  8. 论文笔记:IRGAN——A Minimax Game for Unifying Generative and Discriminative Information

    2017 SIGIR 简单介绍 IRGAN将GAN用在信息检索(Information Retrieval)领域,通过GAN的思想将生成检索模型和判别检索模型统一起来,对于生成器采用了基于策略梯度的强 ...

  9. JMeter5.0 边界提取器使用

    需求: 需要提取下图中requestNo的值,使用JMeter3.1和4.0版本,使用正则表达式提取器始终无法获取 而后使用JMeter5.0的边界提取器,不需要写复杂的正则表达式,只要填写左右边界即 ...

  10. ansible playbook基本操作

    一.ansible playbook简单使用 相当于是把模块写入到配置文件里面 vim /etc/ansible/test.yml //写入如下内容: --- - hosts: 127.0.0.1 r ...