经典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. ...
随机推荐
- php常量作用
PHP常量的特点是: 1.不能通过外部来传递,也就是不能通过get与post还有cookie等方式来传递赋值,所以可以确定是程序执行过程中定义的,非外界变量.2.定义后不能更改,可以防止被篡改. 基于 ...
- zabbix 布署实践【1 server安装】
通过openstack环境,开通了2台只有根分区的虚拟机, 目的是为了监控公司所有的物理机,网络设备,虚拟机,总计300个台以上,推荐配置,zabbix官方文档是有给出指引的 环境:CentO ...
- css2和CSS3的background属性简写
1.css2:background:background-color || url("") || no-repeat || scroll || 0 0; css3: backg ...
- mac 搭建node 开发环境记录
安装homebrew: enter 键 后 输入电脑密码 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/i ...
- 各种编码之间的关系以及getBytes的使用
编码基础知识参考http://my.oschina.net/chape/blog/201725 我对此作了简单的概括 iso8859-1 (通常叫做Latin-1) 属于单字节编码,最多能表示的字符范 ...
- windows自带的线程池
#define _CRT_SECURE_NO_WARNINGS #include "iostream" #include "windows.h" using n ...
- Jsp中out.println()与System.out.println()的区别
第一次上Web实验课时咱写了一个jsp程序: <% System.out.println("Hello The World"); %> 然后放在浏览器下运行,结果是这样 ...
- pageoffice 开发笔记
开发环境:vs2015,mvc,razor pageoffice版本:Server-Version=3.2.0.1 OCX-Version=2,0,4,6 开发模式:pageofficeLink方式 ...
- 解决Windows内存问题的两个小工具RamMap和VMMap(这个更牛更好)
来源:http://www.cr173.com/html/13006_1.html .net程序内存监测分配工具(CLR Profiler for .NET Framework 4)官方安装版 类型: ...
- cocos2d-js引擎学习笔记
cocos2d-js3.0实用语法 /*初始化继承类*/ var Enemy = cc.Sprite.extend({ hp: 0, fileName: "enemy.png", ...