zoukankan      html  css  js  c++  java
  • 动态规划之最长公共子序列(LCS)

             在字符串S中按照其先后顺序依次取出若干个字符,并讲它们排列成一个新的字符串,这个字符串就被称为原字符串的子串

             有两个字符串S1和S2,求一个最长公共子串,即求字符串S3,它同时为S1和S2的子串,且要求它的长度最长,就是这里的

    最长公共子序列问题。

              最长公共子序列问题的递推条件如下:dp[i][j]表示s1前i个字符组成的前缀子串与s2前j个字符组成的前缀子串的最长公共子序列

              dp[0][ j ]( 0<=j<=m) = 0

              dp[ i ][0]( 0<=i<=n) = 0

              dp[ i ] [ j ] = dp[ i-1][ j-1] + 1 ( s1[i]==s2[j] )

              dp[ i ][ j ] = max{ dp[i-1][ j ],dp[i][ j-1]  } ( s1[i] != s2[j] )

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int dp[100][100];
    int max( int a,int b)
    {
        //选取最大值
        return a>b? a:b;
    }
    int main()
    {
        char s1[101],s2[101];
        int i,j;
        int l1,l2;
        while( scanf("%s%s",s1,s2)!=EOF){
            l1 = strlen(s1);
            l2 = strlen(s2);
            for( i=0; i<=l1; i++) dp[i][0] = 0;
            for( j=1; j<=l2; j++) dp[0][j] = 0;
            for( i=1; i<=l1; i++){
                for( j=1; j<=l2; j++){
                    if( s1[i-1]!=s2[j-1])  //字符串数组下标从0开始
                        dp[i][j] = max( dp[i][j-1],dp[i-1][j]);
                    else dp[i][j] = dp[i-1][j-1]+1;
                }
            }
            printf("%d
    ",dp[l1][l2]);
        }
    
        return 0;
    }
    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    简单的Servlet结合Jsp实现请求和响应以及对doGet和doPost的浅析
    My1stServlet
    Myeclipse发布第一个jsp页面及web project部署到tomcat上的几种方法
    java中循环的不同终止方式
    Mybatis学习笔记
    python 进程间的数据交互
    python 进程
    python 队列
    python 多线程
    python paramiko 向linux执行命令和发送接收文件
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8456279.html
Copyright © 2011-2022 走看看