Coincidence (动态规划求最长公共子序列)(王道)
- 题目描述:
-
Find a longest common subsequence of two strings.
- 输入:
-
First and second line of each input case contain two strings of lowercase character a…z. There are no spaces before, inside or after the strings. Lengths of strings do not exceed 100.
- 输出:
-
For each case, output k – the length of a longest common subsequence in one line.
- 样例输入:
-
abcd
cxbydz
- 样例输出:
-
2
#include <iostream>
#include<string.h>
#include<cstdio>
#define MAX(a,b) a>b?a:b
#define N 200
using namespace std; int main()
{
char str1[N];
char str2[N];
int line[N][N];
while(scanf("%s %s",str1,str2)!=EOF){
int len1=strlen(str1);
int len2=strlen(str2); for(int i=;i<=len1;i++)//初始化
line[i][]=;
for(int j=;j<=len2;j++)
line[][j]=;
for(int i=;i<=len1;i++){
for(int j=;j<=len2;j++){
if(str1[i-]!=str2[j-])//当前两个字符不相等
line[i][j]=MAX(line[i][j-],line[i-][j]);
else
line[i][j]=line[i-][j-]+;//相等加一
}
}
printf("%d\n",line[len1][len2]); }
return ;
}分析:line[x][y]求得str1前x个字符组成地前缀子串和str2前y个字符组成的前缀子串的最长公共子序列长度。
若str1[x]==str2[y],即str1中的第x个字符和str2的第y个字符相同,同时由于它们都是各自前缀子串的最后一个字符,那么必存在一个最长公共子串以str1[x]或str2[y]结尾,其他部分等价于str1中前x-1个字符和str2中前y-1个字符的最长公共子串。所以这个子串的长度比line[x-1][y-1]又增加1;
若str1[x]!=str2[y],此时其最长公共子串长度为str1中前x-1个字符和str2中前y个字符的最长公共子串长度与str1中前x-1个字符和str2中前y个字符的最长公共子串长度与str1中前x个字符和str2中前y-1个字符的最长公共子串长度的较大者,即两种情况下得到的最长公共子串都不会因为其中一个字符串又增加了一个字符长度发生改变。
总结:最长公共子序列问题的递推条件:
line[0][j](0<=j<=m)=0;
line[i][0](0<=i<=n)=0;
line[i][j]=line[i-1][j-1]+1;(str1[i]==str2[j])
line[i][j]=max{line[i-1][j],line[i][j-1]};(str[i]!=str2[j])
Coincidence (动态规划求最长公共子序列)(王道)的更多相关文章
- HDU 1243 反恐训练营 (动态规划求最长公共子序列)
反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 九度OJ 1042 Coincidence -- 动态规划(最长公共子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1042 题目描述: Find a longest common subsequence of two strings ...
- [algorithm]求最长公共子序列问题
最直白方法:时间复杂度是O(n3), 空间复杂度是常数 reference:http://blog.csdn.net/monkeyandy/article/details/7957263 /** ** ...
- HDU 1159 Common Subsequence (动态规划、最长公共子序列)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...
- 算法复习周------“动态规划之‘最长公共子序列’”&&《计蒜课》---最长公共子串题解
问题描述: 这个问题其实很容易理解.就是给你两个序列X={x1,x2,x3......xm} Y={y1,y2,y3......ym},要求找出X和Y的一个最长的公共子序列. 例:Xi={A, B, ...
- Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)
583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- VS mfc MessageBox() 和 AfxMessageBox()
转载:http://blog.csdn.net/phenixyf/article/details/41744039 一.MessageBox()用法 1.函数原型 Messagebox函数在Win32 ...
- linux下C的GBD调试学习笔记(转载)
1. 单步执行和跟踪函数调用 看下面的程序: 例 10.1. 函数调试实例 #include <stdio.h> int add_range(int low, int high) { in ...
- 2.shell变量
shell的变量的介绍 shell的变量分为系统变量和用户自定义变量系统变量:$HOME, $PWD, $SHELL, $USER等等,这些变量系统已经定义好了,我们可以直接拿来用用户自定义变量:我们 ...
- python--fnmatch
import fnmatch ''' 这个库专门是用来做文件名匹配的,可以使用通配符如下 * 匹配任何数量的任意字符 ? 匹配单个数量的任意字符 [seq] 匹配seq中的任意字符 [!seq] 匹配 ...
- Grunt环境搭建及使用 前端必备
jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过 ...
- mysql 使用set names 解决乱码问题
引子: 最近查询公司线上表数据,返现在Xshell控制台打印的数据都是乱码,记得之前瞄过同事都是执行set names UTF8 , 解决的,特记录如下.
- lucene api
设置重新打开索引目录(清空) IndexWriterConfig conf = new IndexWriterConfig(new WhitespaceAnalyzer());conf.setOpen ...
- Go嵌入类型及内部提升样例
这个有点新鲜哟... package main import ( "fmt" ) type notifier interface { notify() } type user st ...
- iPhone手机关闭ios10自动更新
在手机上打开safari,地址栏输入:https://oldcat.me/web/NOOTA9.mobileconfig然后回车按照要求安装此provision文件即可,然后重启.桌面出现一个反馈感叹 ...
- 最快的序列化组件protobuf的.net版本protobuf.net
Protobuf是google开源的一个项目,用户数据序列化反序列化,google声称google的数据通信都是用该序列化方法.它比xml格式要少的多,甚至比二进制数据格式也小的多. Prot ...