CJOJ 2044 【一本通】最长公共子序列(动态规划)
CJOJ 2044 【一本通】最长公共子序列(动态规划)
Description
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X,则另一序列Z是X的子序列是指存在一个严格递增的下标序列 ,使得对于所有j=1,2,…,k有 Xij=Zj 。
例如,序列Z是序列X的子序列,相应的递增下标序列为<2,3,5,7>。
给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。
最长公共子序列(LCS)问题:给定两个序列X=和Y=,要求找出X和Y的一个最长公共子序列。
Input
输入两行,每行由大写字母构成的长度不超过200的字符串,表示序列X和Y
Output
第一行非负整数N,表示最长公共子串的长度,若不存在公共子序列输出0.
第二行输出最长的公共子序列(若存在多个,输出最先出现的最长公共子序列)
Sample Input
ABCDDAB
BDCABA
Sample Output
4
Http
CJOJ:http://oj.changjun.com.cn/problem/detail/pid/2044
Source
动态规划
解决思路
这道题是一道动态规划的经典题目。
我们定义F[i][j]表示字符串A的前i位和字符串B的前j位能取到的最长公共子序列,那么自然有F[i][0]均为0,F[0][i]也均为0。
首先我们可以确定的是对于任意的F[i][j],均可以从F[i-1][j](即字符串A减去一个字符)和F[i][j-1](即字符串B减去一个字符)得到,所以必有F[i][j]=min(F[i-1][j]+F[i][j-1])。那么如果A[i]==B[j],则说明F[i][j]还可以从F[i-1][j-1]推得。
所以,综上所述,动态转移方程就是
=min(F[i-1][j],F[i][j-1]) (Other)\]
另外,这道题的加强版在这里。因为数据范围的关系,不能在使用本题这种动态规划 的方法。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
const int maxN=300;
const int inf=2147483647;
string A;
string B;
int F[maxN][maxN];
int main()
{
memset(F,0,sizeof(F));
cin>>A>>B;
for (int i=0;i<A.size();i++)
F[i][0]=0;
for (int i=0;i<B.size();i++)
F[0][i]=0;
for (int i=1;i<=A.size();i++)
for (int j=1;j<=B.size();j++)
if (A[i-1]==B[j-1])
{
F[i][j]=max(F[i-1][j-1]+1,max(F[i-1][j],F[i][j-1]));
}
else
F[i][j]=max(F[i-1][j],F[i][j-1]);
cout<<F[A.size()][B.size()]<<endl;
return 0;
}
CJOJ 2044 【一本通】最长公共子序列(动态规划)的更多相关文章
- 【ACM】最长公共子序列 - 动态规划
最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...
- C++求解汉字字符串的最长公共子序列 动态规划
近期,我在网上看了一些动态规划求字符串最长公共子序列的代码.可是无一例外都是处理英文字符串,当处理汉字字符串时.常常会出现乱码或者不对的情况. 我对代码进行了改动.使用wchar_t类型存储字 ...
- nyoj 36-最长公共子序列 (动态规划,DP, LCS)
36-最长公共子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:18 submit:38 题目描述: 咱们就不拐弯抹角了,如题,需要你做的就是写 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 动态规划 - 最长公共子序列(LCS)
最长公共子序列也是动态规划中的一个经典问题. 有两个字符串 S1 和 S2,求一个最长公共子串,即求字符串 S3,它同时为 S1 和 S2 的子串,且要求它的长度最长,并确定这个长度.这个问题被我们称 ...
- 算法导论-动态规划(最长公共子序列问题LCS)-C++实现
首先定义一个给定序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果,其形式化定义如下:给定一个序列X = <x1,x2 ,..., xm>,另一个序列Z =<z1,z2 ...
- 动态规划---最长公共子序列 hdu1159
hdu1159 题目要求两个字符串最长公共子序列, 状态转换方程 f[i][j]=f[i-1][j-1]+1; a[i]=b[j]时 f[i][j]=MAX{f[i-1][j],f[i][j-1] ...
随机推荐
- 主存与Cache的地址映射
最近在复习计算机体系结构,选用的教材是名闻遐迩的<计算机体系结构 量化研究方法 第五版>(Computer Architecture A Quantitative Approach), 关 ...
- 【Spark2.0源码学习】-10.Task执行与回馈
通过上一节内容,DriverEndpoint最终生成多个可执行的TaskDescription对象,并向各个ExecutorEndpoint发送LaunchTask指令,本节内容将关注Exe ...
- phpcms通过URL传参
在PHPCMS中都会遇到通过URL传参数的问题,但是默认的只能取到$catid.$page等这类的值,特别是伪静态之后,想获得其他参数根本不可能,有的人用$_GET["参数"]这种 ...
- Java中的框架基础面试知识
spring mvc 工作机制(原理): DispatcherServlet主要用作职责调度工作,本身主要用于控制流程 Spring mvc运行原理 1.springmvc将所有的请求都提交给Disp ...
- Canvas学习系列二:Canvas的坐标系统
上一章内容中我们对canvas元素有了一个初步的认识,在接下来的章节中我们会慢慢学习canvas中图形的绘制:但是在绘制之前我们先来看看canvas中的坐标系统,因为这样我们才能知道绘制的图形放在什么 ...
- Spring学习(24)--- AOP之 Aspect instantiation models(aspect实例模式)特别说明
重要: schema-defined aspects只支持singleton model,即 基于配置文件的aspects只支持单例模式
- vue动画的用法
vue动画 在vue.js中有两种写动画的方法,第一种就是像js里一样,用原生代码来实现,第二种则是使用animate.css的动画类文件,这个动画类和bootstrap.css文件类似,直接调用类就 ...
- angular嵌入注入服务实例
<!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...
- Perl格式化输出
Perl格式化输出 问题阐述 有时我们需要大量的重复数据,使用手工易于出错及比较繁琐.抓取特征,可以使用Perl脚本轻松搞定. 输出数据格式 主要特点 随机数生成 格式化输出 序列递增 Perl脚本 ...
- octomap中3d-rrt路径规划
路径规划 碰撞冲突检测 在octomap中制定起止点,目标点,使用rrt规划一条路径出来,没有运动学,动力学的限制,只要能避开障碍物. 效果如下: #include "ros/ros.h&q ...