zoukankan      html  css  js  c++  java
  • [ACM]Common Subsequence

    Common Subsequence

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 18605    Accepted Submission(s): 7875


    Problem Description
    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, xij = 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. 
    The program input is from a text file. Each data set in the file contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct. 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
     

    Source



    动态规划解题辅助图:


    图中矩阵 [ i  ]  [j  ]的意思是 第一个字符串从1到i个字母这一段与第二个字符串从1到j个字母这一段所具有的相同字母数,比如 矩阵中第二行第二列的数字为2  代表 ab  与 ab相同字母个数为2, 再比如第六行第一列的数字为1,代表abfcab 与a的相同字母个数为1。

    通过图可以找到状态转移方程:

    if(a [ i ] == b[ j ])   s[ i ] [ j ]=s[ i-1 ] [ j-1 ] +1;   当前格的数字等于其左上角的数字+1 

    if(a [ i ] != b [ j ])   s[ i ] [ j ]= max(  s[ i -1 ] [ j ]  , s[ i ] [ j-1 ] )  当前格的数字等于 其左边的格的数字与上边的格的数字的最大值 



    代码:

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <stdio.h>
    using namespace std;
    int s[1002][1002];
    int main()
    {
        string s1,s2;
        int len1,len2;
        int i,j;
        while(cin>>s1>>s2)
        {
            memset(s,0,sizeof(s));
            len1=s1.length();
            len2=s2.length();
    
            for(i=1;i<=len1;i++)
                for(j=1;j<=len2;j++)//辅助图里面的数字是从第一行,第一列开始的,
            {
                if(s1[i-1]==s2[j-1])//字符串的第一个字母为s[0],而不是s[1]切记
                    s[i][j]=s[i-1][j-1]+1;//状态转移方程
                else
                    s[i][j]=max(s[i-1][j],s[i][j-1]);//状态转移方程
            }
            cout<<s[len1][len2]<<endl;
        }
        return 0;
    }
    


    运行截图:


  • 相关阅读:
    四川第七届 C Censor (字符串哈希)
    四川第七届 C Censor (字符串哈希)
    Android:实现两个Activity相互切换而都不走onCreate()
    正宗佛祖凝视-原装正版
    iOS中数组遍历的方法及比較
    html5 返回当前地理位置的坐标点(经纬度)
    Android之——卸载应用程序
    Android—— 4.2 Vold挂载管理_NetlinkManager (四)
    2014年java软件project师面试题收集
    C++刷题——2736: 指针练习--输出最大值
  • 原文地址:https://www.cnblogs.com/sr1993/p/3697828.html
Copyright © 2011-2022 走看看