动态规划 ---- 最长公共子序列(Longest Common Subsequence, LCS)

分析:

完整代码:

// 最长公共子序列
#include <stdio.h>
#include <algorithm>
using namespace std;

const int N = 100;
char A[N], B[N];
int dp[N][N];

int main()
{
    freopen("in.txt", "r", stdin);
    int n;
    gets(A + 1);        // 从下标1开始读入
    gets(B + 1);
    int lenA = strlen(A + 1);    // 由于读入时下标从1开始,因此读取长度也从1开始
    int lenB = strlen(B + 1);

    // 边界
    for (int i = 0; i <= lenA; i++){
        dp[i][0] = 0;
    }
    for (int j = 0; j <= lenB; j++){
        dp[0][j] = 0;
    }

    // 状态转移方程
    for (int i = 1; i <= lenA; i++){
        for (int j = 1; j <= lenB; j++){
            if (A[i] == B[j]){
                dp[i][j] = dp[i - 1][j - 1] + 1;
            }
            else{
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    // dp[lenA][lenB]是答案
    printf("%d\n", dp[lenA][lenB]);
    fclose(stdin);
    return 0;
}

题型实战:

                1045 Favorite Color Stripe (30分)

Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in her favorite order by cutting off those unwanted pieces and sewing the remaining parts together to form her favorite color stripe.

It is said that a normal human eye can distinguish about less than 200 different colors, so Eva‘s favorite colors are limited. However the original stripe could be very long, and Eva would like to have the remaining favorite stripe with the maximum length. So she needs your help to find her the best result.

Note that the solution might not be unique, but you only have to tell her the maximum length. For example, given a stripe of colors {2 2 4 1 5 5 6 3 1 1 5 6}. If Eva‘s favorite colors are given in her favorite order as {2 3 1 5 6}, then she has 4 possible best solutions {2 2 1 1 1 5 6}, {2 2 1 5 5 5 6}, {2 2 1 5 5 6 6}, and {2 2 3 1 1 5 6}.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤200) which is the total number of colors involved (and hence the colors are numbered from 1 to N). Then the next line starts with a positive integer M (≤200) followed by M Eva‘s favorite color numbers given in her favorite order. Finally the third line starts with a positive integer L (≤10?4??) which is the length of the given stripe, followed by L colors on the stripe. All the numbers in a line a separated by a space.

Output Specification:

For each test case, simply print in a line the maximum length of Eva‘s favorite stripe.

Sample Input:

6
5 2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6

Sample Output:

7

分析:

完整代码:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int maxc = 210;        // 颜色的最大种类数
 6 const int maxn = 10010;        // 颜色序列的最大长度
 7 int A[maxc], B[maxn], dp[maxc][maxc];
 8
 9 int main()
10 {
11     int n, m;
12     scanf("%d%d", &n, &m);
13     for (int i = 1; i <= m; i++){
14         scanf("%d", &A[i]);
15     }
16     int L;
17     scanf("%d", &L);
18     for (int i = 1; i <= L; i++){
19         scanf("%d", &B[i]);
20     }
21     // 边界
22     for (int i = 0; i <= m; i++){
23         dp[i][0] = 0;
24     }
25     for (int j = 0; j <= L; j++){
26         dp[0][j] = 0;
27     }
28
29     // 状态转移方程
30     for (int i = 1; i <= m; i++){
31         for (int j = 1; j <= L; j++){
32             // 取dp[i - 1][j]、dp[i][j - 1]中的较大值
33             int Max = max(dp[i - 1][j], dp[i][j - 1]);
34             if (A[i] == B[j]){
35                 dp[i][j] = Max + 1;
36             }
37             else{
38                 dp[i][j] = Max;
39             }
40         }
41     }
42
43     // 输出答案
44     printf("%d\n", dp[m][L]);
45
46     return 0;
47 }

原文地址:https://www.cnblogs.com/hi3254014978/p/12248210.html

时间: 2024-10-11 22:52:33

动态规划 ---- 最长公共子序列(Longest Common Subsequence, LCS)的相关文章

UVA10100:Longest Match(最长公共子序列)&amp;&amp;HDU1458Common Subsequence ( LCS)

题目链接:http://blog.csdn.net/u014361775/article/details/42873875 题目解析: 给定两行字符串序列,输出它们之间最大公共子单词的个数 对于给的两个序列X 和 Y,用i 和 j分别作为它们的前缀指针,f[i][j]表示序列X的前缀Xi 和 序列Y的前缀Yi 的最长公共子序列的长度,在这道题中,可把每一个单词当作一个字符来进行比较. 当 i | j 为0时 ,此 f[i][j] = 0; 当 i!=0 && j!=0 &&

nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)

最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2).但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n).  具体分析参考:http://blog.chinaunix.net/uid-26548237-id-3757779.html 代码: #include <iostream> using namespace std; int LIS_nlogn(int *arr, int len) { int *LIS = new int[len

最长公共子串(Longest common substring)

问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子串.(子串中的字符要求连续) 这道题和最长公共子序列(Longest common subsequence)很像,也可以用动态规划定义.公式如下: 这里c[i,j]表示以Xi,Yj结尾的最长公共子串的长度. 程序实现: int longestCommonSubstring(string x, string y) { int m = x.length();

动态规划----最长公共子序列(C++实现)

最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i2 < - < ik }的序列. 输入样例 2       asdf       adfsd       123abc       abc123abc 输出样例 3 6 解题思路: 这道题是被称为最长公共子序列的问题(LCS,Longest Common Subsequence)的著名问题.这道题

动态规划(二)最长公共子串(Longest Common Substring)

题目描述: 求两个输入序列的最长的公共子字符串的长度.子字符串中的所有字符在源字符串中必须相邻. 如字符串:21232523311324和字符串312123223445,他们的最长公共子字符串为21232,长度为5. 最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为: 子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列:也就是说,子串中字符的位置必须

利用后缀数组(suffix array)求最长公共子串(longest common substring)

摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其重要的优势在于可以编码简单,代码易于理解,适合快速实现. 首先,来说明一下,LCS通常指的是公共最长子序列(Longest Common Subsequence,名称来源参见<算法导论>原书第3版p223),而不是公共最长子串(也称为最长公共子串). 最长公共子串问题是在文本串.模式串中寻找共有的

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

(1).问题描述:给出2个序列,x是从1到m,y是从1到n,找出x和y的最长公共子序列? x:A B C B D A B y:B D C A B A 则:最长公共子序列长度为4,BDAB BCAB BCBA均为LCS(最长公共子序列): 模型实现图: (2).问题解决 代码实现了最长公共子序列的长度 #include<stdio.h> #define N    10 int LCS(int *a, int count1, int *b, int count2); int LCS(int *a,

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

最长公共子序列也是动态规划中的一个经典问题. 有两个字符串 S1 和 S2,求一个最长公共子串,即求字符串 S3,它同时为 S1 和 S2 的子串,且要求它的长度最长,并确定这个长度.这个问题被我们称为 最长公共子序列问题. 与求最长递增子序列一样,我们首先将原问题分割成一些子问题,我们用 dp[i][j]表示 S1 中前 i 个字符与 S2 中前 j 个字符分别组成的两个前缀字符串的最 长公共子串长度. 显然的,当 i. j 较小时我们可以直接得出答案,如 dp[0][j]必 等于 0.那么,

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

最长公共子序列(LCS)是一类典型的动归问题. 问题 给定两个序列(整数序列或者字符串)A和B,序列的子序列定义为从序列中按照索引单调增加的顺序取出若干个元素得到的新的序列,比如从序列A中取出 A[i1], A[i2], ...A[ik],其中0=< i1 <= i2 <= ... ik <= n-1得到的新的序列 A[i1].A[i2]....A[ik]即为A的一个子序列.     两个不同的原序列A和B可能有着相同的子序列,求出A和B的公共子序列的最长长度. 分析     这种