经典dp 最长公共子序列
首先,说明一下子序列的定义……
一个序列A={a1,a2,a3,...,an},从中删除任意若干项,剩余的序列叫A的一个子序列。
很明显(并不明显……),子序列……并不需要元素是连续的……(一开始的时候思维总是以为元素是连续的,好傻啊……)
然后是公共子序列……
如果C是A的子序列,也是B的子序列,那么C是A和B的公共子序列……
公共子序列一般不止一个,最长的那个就是最长公共子序列,当然也可能不止一个……
煮个栗子……
A={1,3,6,9,5,4,8,7},B={1,6,3,4,5,7}
{1,4,7}是A和B的公共子序列
{1,3,4,7}是A和B的最长公共子序列
好了,说明的部分就到这,接下来,进入解决问题的部分……
给出序列A={a1,a2,a3...an},B={b1,b2,b3...bn}
我们用lcs[i][j]来表示A的前i项和B的前j项的最长公共子序列的长度
flag[i][j]表示这一点是由哪点继承来的,然后,开始搜索……
如果……
(1)A[i]==B[j]
那么就代表lcs[i][j]的最后一项一定是A[i],就是在lcs[i-1][j-1]接上A[i],也就是lcs[i][j]=lcs[i-1][j-1]+1,并记录flag[i][j]
(2)A[i]!=B[j]
那么lcs[i][j]=max(lcs[i-1][j-1],lcs[i][j-1]),因为既然接不上,那就继承一个长一点的留着呗,不要忘记了flag[i][j]的数字是不同的亲~
可能我说的比较简略,上一张比较好理解的图……
可能第一次看会很凌乱,仔细看吧亲……
最后按flag打出来就好了~
最后上代码
#include<stdio.h>
#include<string.h>
int lcs[][];
int flag[][];
char a[],b[];
void findlcs(char a[],char b[],int lena,int lenb){
int i,j;
for(i=;i<=lena;i++)
for(j=;j<=lenb;j++){
if(a[i-]==b[j-]){
lcs[i][j]=lcs[i-][j-]+;
flag[i][j]=;
}
else{
if(lcs[i][j-]>lcs[i-][j]){
lcs[i][j]=lcs[i][j-];
flag[i][j]=;
}
else{
lcs[i][j]=lcs[i-][j];
flag[i][j]=;
}
}
}
}
void printlcs(char a[],char b[],int lena,int lenb){
int i=lena;
int j=lenb;
int len=;
int rec[];
while(i>&&j>){
if(flag[i][j]==){
rec[len++]=a[i-];
i--,j--;
}
else if(flag[i][j]==) j--;
else if(flag[i][j]==) i--;
}
len--;
while(len>=){
printf("%c",rec[len--]);
}
printf("\n");
}
int main(){
while(~scanf("%s%s",a,b)){
int lena=strlen(a);
int lenb=strlen(b);
findlcs(a,b,lena,lenb);
printlcs(a,b,lena,lenb);
memset(flag,,sizeof(flag));
memset(lcs,,sizeof(lcs));
}
return ;
}
经典dp 最长公共子序列的更多相关文章
- hdu1159 dp(最长公共子序列)
题意:给两个字符串,求这两个字符串的最长公共子序列的长度 因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊``` 解法就是通过两个字符串的每个字符互相比较,根 ...
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 56150 Accepted: 19398 Desc ...
- poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 53414 Accepted: 18449 Desc ...
- 经典算法-最长公共子序列(LCS)与最长公共子串(DP)
public static int lcs(String str1, String str2) { int len1 = str1.length(); int len2 = str2.length() ...
- HDU 1159 Common Subsequence【dp+最长公共子序列】
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- POJ - 1458 Common Subsequence DP最长公共子序列(LCS)
Common Subsequence A subsequence of a given sequence is the given sequence with some elements (possi ...
- hdu 1503:Advanced Fruits(动态规划 DP & 最长公共子序列(LCS)问题升级版)
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- POJ1458 Common Subsequence —— DP 最长公共子序列(LCS)
题目链接:http://poj.org/problem?id=1458 Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Tot ...
- 动态规划经典算法--最长公共子序列 LCS
转移方程 代码: //法一: #include <bits/stdc++.h> using namespace std; //---------------https://lunatic. ...
随机推荐
- ECMAScript6之Array类型的扩展
数组的扩展 Array.of() 将一组值转换成数组 Array.of(1,2,3,4,5); //[1,2,3,4,5] Array.from() 可将类似数组的对象或者可便利的对象转换成数组,比如 ...
- 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助
初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...
- ios开发设置不同字体
最近项目开发中遇到需要设置指定字体的需求,研究了一下字体设置,最后附有我写的一个小demo,先来看一下效果: 开始上网搜了一下,普遍说到以下方法 for(NSString *fontfamilynam ...
- Objective-C Runtime 运行时之四:Method Swizzling(转载)
理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...
- maven发布本地包,eclipse-maven集成tomcat7热部署项目
国内maven 库 :http://maven.aliyun.com/nexus/content/groups/public/ maven安装不在中央仓库的jar包: mvn install:inst ...
- centos 安装cacti监控
CentOS 6下Cacti搭建文档 安装依赖关系 yum -y install mysql-devel httpd php php-pdo php-snmp php-mysql lm_sensors ...
- Python基础(七)-文件操作
一.文件处理流程 1.打开文件,得到文件句柄赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 二.基本操作 f = open('zhuoge.txt') #打开文件 first_line = ...
- 【翻译】从github部署Tutorial文件
Tips:原文链接:http://ccoenraets.github.io/cordova-tutorial/setup-files.html 删除workshop/www文件夹下面都全部内容 从gi ...
- uiwebview 加载html时字体变小 加载前或加载后改变字体大小
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae } p.p2 { margin: 0.0px 0. ...
- Web Service循序渐进学习
1.Web service 是什么? (WebService 是可以通过互联网远程访问调用的应用程序,实现数据传输共享.这种应用程序理解为不同服务提供帮助.能够支撑实现应用程序发布访问的技术可以称为W ...