DP算法之—Longest Common Subsequence
来源:互联网 发布:测试耳机的软件 编辑:程序博客网 时间:2024/06/07 22:12
最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。而最长公共子串(要求连续)和最长公共子序列是不同的。
序列比对算法是生物信息学中经常使用的方法,而寻找两个序列的最长公共子序列也是其中的基础。除了暴力查找,动态规划是解决最长公共子序列的常用算法。
问题分析
假设
1.
2.
3.
由以上分析(三点均可用反证法证明),可以得到问题的递推公示:
设
程序实现
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#define NUM 1000using namespace std;int c[NUM][NUM];int b[NUM][NUM];void LCSLength(int m,int n,char x[],char y[]);void LCS(int m,int n,char x[]);int main(int argc, char *argv[]) { char x[NUM]; char y[NUM]; int m, n; scanf("%d\n", &m); for (int i=1; i<=m; i++) scanf("%c", &x[i]); scanf("%d\n", &n); for (int i=1; i<=n; i++) scanf("%c", &y[i]); LCSLength(m, n, x, y); printf("%d\n", c[m][n]); LCS(m,n,x); return 0;}void LCSLength(int m,int n,char x[],char y[]){ int i,j; for(i = 1; i <= m; i++) c[i][0] = 0; for(j = 1; j <= n; j++) c[0][j] = 0; for(i = 1; i <= m; i++) { for(j = 1; j <= n; j++) { if(x[i] == y[j]) { c[i][j] = c[i-1][j-1] + 1; b[i][j] = 1; } else if(c[i-1][j] >= c[i][j-1]) { c[i][j] = c[i-1][j]; b[i][j] = 3; } else { c[i][j] = c[i][j-1]; b[i][j] = 2; } } }}void LCS(int i,int j,char x[]) { if(i == 0 || j == 0) return; if(b[i][j] == 1) { LCS(i-1,j-1,x); cout << x[i]; } else if(b[i][j] == 2) LCS(i,j-1,x); else LCS(i-1,j,x);}
阅读全文
1 0
- DP算法之—Longest Common Subsequence
- [DP]Longest Common Subsequence
- UVA_10405 Longest Common Subsequence(DP)
- 算法分析: Longest Common Subsequence
- LCS(Longest Common Subsequence)算法
- UVA 10405 Longest Common Subsequence (dp + LCS)
- UVa 10405 Longest Common Subsequence (DP&LCS)
- UVA 10405 Longest Common Subsequence --经典DP
- uva--10405Longest Common Subsequence+dp
- Uva 10405-Longest Common Subsequence(DP)
- codewars—Longest Common Subsequence
- Uva 10405—Longest Common Subsequence
- longest common subsequence
- Longest Common Subsequence
- 10405 Longest Common Subsequence
- UVa10405 - Longest Common Subsequence
- 10405 - Longest Common Subsequence
- UVa10405 - Longest Common Subsequence
- Spring 基于注解的IOC配置&整合Junit
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- JavaScript版正则表达式组合和限制字符
- SCU
- Struts2创建项目3--Struts2传值
- DP算法之—Longest Common Subsequence
- HDU 6140 Hybrid Crystals【题意】【思维】
- #426 (Div. 2) B. The Festive Evening
- Object.prototype.toString.call()方法浅谈
- 进程间通信(一)
- 网络基础与网络分层
- PAT 1021 个位数统计
- PHP、Python 和 Ruby 语言的区别
- mysql 运算符和函数