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

    一、什么是最长公共子序列

      例:设有两个字符串str1="nyiihaoo" , str2="niyeyiyang",那么"nyiihaoo"中的子序列:"ny" 长度是2; "niyeyiyang"中的子序列:"ny"长度也为2,这是str1与str2的一个公共子序列,长度为2。那么这两个字符串最长的公共子序列应该是什么呢?  显然是        "nyi ih oo"(或  "ny i ia oo") 中"nyia"   以及   "n i y ey i y a ng"(或" n iye yi y a ng ")中的"nyia"  : 其"nyia"长度是4,在str1和str2中我们找不到长度大于4的最长公共子序列了。所以str1和str2的最长公共子序列的长度是4。

    二、动态规划(dynamic programing)解决最长公共子序列长度问题

      我们首先定义一个二维数组 dp[i][j]  其含义是:str1中前 i-1 个字符 与 str2中前j-1个字符中最长公共子序列的长度。          

      这时我们要找出其动态转移方程,分析 ( 要结合数组的意义理解 ) :

          当  str1[i-1]==str2[j-1]  , dp[i][j]  =  dp[i-1][ j-1]+1 ;

          否则:d[i][j] = max{   dp[i-1][ j ]  ,dp[ i ][ j-1 ] };

    三、代码实现(c++)

         

    #include<iostream>
    #include<cstring>
    #include<string>
    using namespace std;
    int a[2000][2000];
    int main(){
    	string str1,str2;
    	while(cin>>str1>>str2){
    		memset(a,0,sizeof(a));
    		int i=0,j=0;
    		for(int i=1;i<=str1.length();i++){
    			for(int j=1;j<=str2.length();j++){
    				if(str1[i-1]==str2[j-1]){
    					a[i][j]=a[i-1][j-1]+1; 
    				}
    				else{
    					a[i][j]=max(a[i-1][j],a[i][j-1]);
    				}	
    			}
    		}
    		cout<<a[str1.length()][str2.length()]<<endl;
    	}
    }
    

      

  • 相关阅读:
    面试题-Java多线程基础、实现工具和可见性保证(新更新版)
    Linux脚本-使用jar自动替换配置文件
    让ie兼容opacity属性的方法
    rgba兼容ie
    ie6的又一个变态问题
    长为112px的td里面有一个块span,居中时引起的兼容问题
    ie8中position不显示的问题
    haslayout
    CSS中zoom作用
    Vue学习笔记一
  • 原文地址:https://www.cnblogs.com/z-bear/p/9466117.html
Copyright © 2011-2022 走看看