最长公共子序列_动态规划

具体问题的描绘和分析如下

从上图可知,要构造两个二维数组,数组L用来求各种取值的子最长公共子序列,则最后一个元素就是最长公共子序列的长度,从右边的二维表,数值为1,则就是公共的元素,我们用数组记录下来,

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int Maxson(int m,int n,char array[],char array1[],int L[][100],int s[][100],char z[])
 4 {
 5
 6     for(int i=0;i<=m;i++){// //初始化第0行
 7
 8         L[i][0]=0;
 9     }
10      for(int j=0;j<=n;j++){// //初始化第0列
11         L[0][j]=0;
12     }
13     for(int i=1;i<=m;i++){
14         for(int j=1;j<=n;j++){
15             if(array1[j]==array[i]){//式子(1)对应的代码
16                 L[i][j]=L[i-1][j-1]+1;
17                 s[i][j]=1;
18             }else{//式子(2)对应的代码
19                L[i][j]=max(L[i][j-1],L[i-1][j]);
20                if(L[i][j-1]>=L[i-1][j]){
21                 s[i][j]=2;
22                }
23                else{
24                 s[i][j]=3;
25                }
26             }
27         }
28     }
29     int i=m;
30     int j=n;
31     int k=L[m][n];
32     while(i>0&&j>0){//从二维数组s里面得到公共子序列的元素
33         if(s[i][j]==1){
34             z[k]=array[i]; k--; i--; j--;
35         }
36           else if (s[i][j]==2) j--;
37                else i--;
38
39     }
40     return L[m][n];
41 }
42 int main()
43 {
44     int m;
45     cout << "请输入第一个序列的元素的个数" << endl;
46     cin >> m;
47     cout << "请输入第一个序列的每个元素" << endl;
48     char array[m+1];
49
50     for(int i=1;i<=m;i++){
51         cin >> array[i];
52     }
53     int n;
54     cout << "请输入第二个序列的元素的个数" << endl;
55     cin >> n;
56     cout << "请输入第二个序列的每个元素" << endl;
57     char array1[n+1];
58     for(int i=1;i<=n;i++){
59         cin >> array1[i];
60     }
61     int L[m+1][100];
62     int s[m+1][100];
63     memset(L,0,sizeof(L));
64     memset(s,0,sizeof(s));
65     char z[100];
66     memset(z,0,sizeof(z));
67     cout <<"公共子序列长度是" <<Maxson(m,n,array,array1,L,s,z)<< endl;
68     cout << " 公共子序列是"<< endl;
69     for(int i=1;i<=n;i++){
70        cout << z[i]<< " ";
71     }
72     return 0;
73 }

运行结果如下:

原文地址:https://www.cnblogs.com/henuliulei/p/10074366.html

时间: 2024-10-10 07:14:02

最长公共子序列_动态规划的相关文章

nyist oj 36 最长公共子序列 (动态规划基础题)

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接

最长公共子序列(动态规划)

#include<iostream> #include<vector> #include<iterator> #include<algorithm> #include<string> using namespace std; /* *最长公共子序列(动态规划) */ vector<vector<int>> c;//c[i][j]记录串a[0..i]与串b[0..j]之间的最长公共子序列的长度 vector<vecto

动态规划_基础_最长公共子序列_多种方法_递归/dp

D: 魔法少女资格面试 题目描述 众所周知,魔法少女是一个低危高薪职业.随着近年来报考魔法少女的孩子们越来越多,魔法少女行业已经出现饱和现象!为了缓和魔法少女界的就业压力,魔法少女考核员丁丁妹决定增加魔法少女资质考核的难度.然而,即使如此,通过资质考核的魔法少女们数量仍然过多,因此,丁丁妹决心增加一轮面试,从而淘汰掉更多的预备魔法少女.具体而言,她打算对所有面试者询问这样一个问题:给两个长度为 n 的全排列,它们的最长公共子序列长度是多少?不幸的是,由于丁丁妹没有好好上过学,她自己也不知道答案是

最长公共子序列问题---动态规划

最长递增子序列问题是一个很基本.较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法.由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能够锻炼设计较复杂算法的思维,我对这个问题进行了较深入的分析思考,得出了几种复杂度不同算法,并给出了分析和证明. 一,    最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1&l

LCS问题(最长公共子序列)-动态规划实现

问题描述: 问题] 求两字符序列的最长公共字符子序列 注意: 并不要求子串(字符串一)的字符必须连续出现在字符串二中. 思路分析: 最优子结构和重叠子问题的性质都具有,所以要采取动态规划的算法 最长公共子序列的结构 设序列X= 其中Xm-1= 子问题的递归结构 由最长公共子序列问题的最优子结构性质可知,要找出X= 由此递归结构容易看到最长公共子序列问题具有子问题重叠性质. 例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列.而这两个子问题都包含一个公共子

求序列1和序列2的最长公共子序列-基于动态规划方法

1 #include <cstdlib> 2 #include <iostream> 3 #include <cstring> 4 5 using namespace std; 6 7 class maxlen_string 8 { 9 public: 10 void string_(); 11 void LCSLength(int,int,char*,char*,int**,int**); 12 void LCS(int,int,char*,int**); 13 ~m

HDU 1159 Common Subsequence (动态规划、最长公共子序列)

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 55301    Accepted Submission(s): 25537 Problem Description A subsequence of a given sequence is the given sequence with some el

最长公共子序列python实现

最长公共子序列是动态规划基本题目,下面按照动态规划基本步骤解出来. 1.找出最优解的性质,并刻划其结构特征 序列a共有m个元素,序列b共有n个元素,如果a[m-1]==b[n-1],那么a[:m]和b[:n]的最长公共子序列长度就是a[:m-1]和b[:n-1]的最长公共子序列长度+1:如果a[m-1]!=b[n-1],那么a[:m]和b[:n]的最长公共子序列长度就是MAX(a[:m-1]和b[:n]的最长公共子序列长度,a[:m]和b[:n-1]的最长公共子序列长度). 2.递归定义最优值

算法导论_动态规划_最长公共子序列

一.动态规划的概念 动态规划(Dynamic Programming)是通过组合子问题的解而解决整个问题的.分治是指将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原始问题的解,与此不同,动态规划适用于子问题不是独立的情况,也就是各个子问题包含公共的子问题.在这种情况下,采用分治法会做许多不必要的工作,即重复地求解公共地子问题.动态规划算法对每个子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类问题可