动态规划——最长公共子序列(算法设计课题)
问题描述:
若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}
是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。
给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。
给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
解题思路:
设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,则
(1)若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。
(2)若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。
(3)若xm≠yn且zk≠yn,则Z是X和yn-1的最长公共子序列。
由于在所考虑的子问题空间中,总共有θ(mn)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率。
#include<stdio.h>
#include<string.h>
#define MAXLEN 100
void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN])
{int i, j; for(i = 0; 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-1] == y[j-1]){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] = 2;}else{c[i][j] = c[i][j-1];b[i][j] = 3;}}}
}
void PrintLCS(int b[][MAXLEN],char *x,int i,int j)
{if(i==0||j==0)return;if(b[i][j]==1){PrintLCS(b,x,i-1,j-1);printf("%c",x[i-1]); }else if(b[i][j]==2)PrintLCS(b,x,i-1,j);elsePrintLCS(b,x,i,j-1);
}int main(int argc, char **argv)
{char x[MAXLEN];char y[MAXLEN];int b[MAXLEN][MAXLEN];int c[MAXLEN][MAXLEN];int m,n;while(-1){gets(x);gets(y);m=strlen(x);n=strlen(y); LCSLength(x,y,m,n,c,b);PrintLCS(b,x,m,n); printf("\n");
}return 0;
}
动态规划——最长公共子序列(算法设计课题)相关推荐
- c语言最长公共子序列,算法设计与分析/动态规划——最长公共子序列LCS及模板...
这位大佬写的对理解DP也很有帮助,我就直接摘抄过来了,代码部分来自我做过的题 一,问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符 ...
- 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)
最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...
- 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence
动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...
- 详解动态规划最长公共子序列--JavaScript实现
前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...
- 动态规划1--最长公共子序列
动态规划1--最长公共子序列 一.动态规划 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并 综合子问题的解导出大问题的解的方法,问题求解耗时 ...
- JavaScript实现longestCommonSubsequence最长公共子序列算法(附完整源码)
JavaScript实现longestCommonSubsequence最长公共子序列算法(附完整源码) longestCommonSubsequence.js完整源代码 longestCommonS ...
- 两个字符串的最长公共子序列长度_程序员编程算法,解决文本相似度问题的最长公共子序列算法!...
在前面我讲解了如何通过最长公共子串来求解两个文本的相似度问题,但它有一定缺陷,举个例子,看下面的两个字符串 我爱吃小青菜和各种鲜水果. 我很爱吃青菜与各样水果. 上面两个字符串,如果通过计算子串来求相 ...
- 最长公共子序列php,动态规划(最长公共子序列LCS)
概念 求解决策过程最优化的结果 (可能有多个) 把多阶段过程转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解 计算过程中会把结果都记录下,最终结果在记录中找到. 举例 求两个字符串的最长公共子序 ...
- 算法设计-动态规划——最长公共子序列
算法介绍 动态规划: 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待 ...
最新文章
- 给娃写个游戏,庆祝嫦娥五号登月
- SOA标准之----SCA架构思想
- 使用Linux的lsblk命令列出块设备信息
- 语音信号短时域分析之预处理(三)
- 春招不迷茫,模板刷题101实验室上线啦
- MVC架构简介及其测试策略
- ogg replicat 进程 abend 处理
- 隐藏频道_《TED频道》-隐藏真实自我
- rpm | 升级软件包
- SpringBoot-核心功能
- Maven知识点记录 - profile
- tcpdf html 支持css吗,TCPDF 5.1 发布,增加对CSS的支持
- 输出源文件的标题,目前执行行的行数,编译时间
- 国际自主智能机器人大赛强势来袭,NAACL同声传译任务等你来战
- 在ARM板上运行Qt程序
- 傲腾服务器硬盘,Intel傲腾Optane硬盘实测:“高价U盘”,加速性能不错
- 基因、DNA、碱基、染色体之间的关系是什么?
- 微信java版_JAVA版微信支付V3-完全版
- win10系统停止更新服务器,Win10系统关闭自动更新功能的三种最佳方法
- Leetcode 刷题记录
热门文章
- php在线答题怎么评分,在线答题系统怎样进行阅卷?
- mysql source code_Source Code
- 换肤的css,换肤功能,css文件中准备三套颜色
- 接口文档要写在概要设计里吗_写代码的五个步骤,你会几个?
- [Unity] GameFramework 学习记录 5
- vuejs项目性能优化 - 总结篇
- shishuo-CMS-master
- foundApp宣传展示页企业网站模板
- asp留言板源码-XYCMS留言板 v8.0
- python编写程序输入整数n求n_Python入门习题----N=ABXBA