zoukankan      html  css  js  c++  java
  • 【POJ

    Common Subsequence


     Descriptions:

    A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, x ij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.

    Input

    The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

    Output

    For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.

    Sample Input

    abcfbc abfcab

    programming contest

    abcd mnp

    Sample Output

    4

    2

    0

    题目连接:https://vjudge.net/problem/POJ-1458

    题目大意

    给出两个字符串,先求出这样的一个最长的公共子序列的长度:子序列中的每个字符串都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致

     

    设数组dp[i][j],i表示第一个字符串的位置i,j表示第二个字符串的位置j,如果s1[i]==s2[j]j,那么dp[i][j]=dp[i-1][j-1]+1.否则dp[i][j]=max(dp[i-1][j],dp[i][j-1]).理解不了的,可以按样例一画一个表格试试就知道了

     

    AC代码

    #include <iostream>
    #include <cstdio>
    #include <fstream>
    #include <algorithm>
    #include <cmath>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <cstring>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #define ME0(X) memset((X), 0, sizeof((X)))
    using namespace std;
    string s1,s2;
    int dp[1005][1005];
    int main()
    {
        while(cin >> s1 >> s2)
        {
            ME0(dp);
            int len1=s1.length();
            int len2=s2.length();
            for(int i=1; i<=len1; i++)
            {
                for(int j=1; j<=len2; j++)
                {
                    if(s1[i-1]==s2[j-1])
                        dp[i][j]=dp[i-1][j-1]+1;
                    else
                    {
                        dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
                    }
                }
            }
            cout << dp[len1][len2] << endl;
        }
    }

     

     

  • 相关阅读:
    jquery通过val()取不到textarea中的值
    form表单右边弹窗提示不能为空
    正则表达式
    layui表格的批量删除功能
    layui中table表格的操作列(删除,编辑)等按钮的操作
    layui动态渲染生成select的option值
    layui实现table表格的“关键字搜索”功能
    Python3基础 break while循环示例
    Python3基础 bool类型变量赋值
    Python3基础 assert 断言 确保程序的正确运行条件
  • 原文地址:https://www.cnblogs.com/sky-stars/p/10936527.html
Copyright © 2011-2022 走看看