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. Preparing Olympiad---cf550B(DFS或者状态压缩模板)

    比赛链接:http://codeforces.com/problemset/problem/550/B 给你n个数,选出来只是2个然后求他们的和在L和R的区间内,并且选出来的数中最大值和最小值的差不得 ...

  2. Python3 格式化输出 %s & %d 等

    1.打印字符串 print("My name is %s" %("Alfred.Xue")) #输出效果:My name is Alfred.Xue 2.打印整 ...

  3. Linux which命令

    which常用与查看并显示指定命令的绝对路径,使用which命令,还可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令. 1.用法 which [命令] 2.实例 1)查看 ls 命令的绝 ...

  4. 文本情感分类:分词 OR 不分词(3)

    为什么要用深度学习模型?除了它更高精度等原因之外,还有一个重要原因,那就是它是目前唯一的能够实现“端到端”的模型.所谓“端到端”,就是能够直接将原始数据和标签输入,然后让模型自己完成一切过程——包括特 ...

  5. G729 详细使用文档

    https://tools.ietf.org/html/rfc4749 git://git.linphone.org/linphone-android.git http://stackoverflow ...

  6. Laravel 5.3 使用内置的 Auth 组件实现多用户认证功能

    https://blog.csdn.net/kevinbai_cn/article/details/54341779 概述 在开发中,我们经常会遇到多种类型的用户的认证问题,比如后台的管理员和前台的普 ...

  7. NGS中的一些软件功能介绍

    1.bowtie 短序列比对工具,blast也是短序列比对工具,速度快,结果易理解. 输入可以是fastq或者fasta文件. 生成比对结果文件sam格式的吧. 2.bwa 转自:https://ww ...

  8. BD面试题1-两个大文件中找出公共记录[转载]

    转自:https://blog.csdn.net/tiankong_/article/details/77234726#commentBox 1.题目 给定a.b两个文件,各存放50亿个url,每个u ...

  9. Java中的反射[转载]

    转自:https://blog.csdn.net/sinat_38259539/article/details/71799078#commentBox 1.什么是反射? 反射是通过一个类可以知道其中所 ...

  10. Java网络通信基础编程

    一.同步阻塞方式(BIO) 方式一: 服务器端(Server): package com.ietree.basicskill.socket.mode1; import java.io.IOExcept ...