動態規劃dp———LCS 最長公共子序列

1、什麼是最長公共子序列ios

  例:設有兩個字符串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。c++

2、動態規劃(dynamic programing)解決最長公共子序列長度問題數組

  咱們首先定義一個二維數組 dp[i][j]  其含義是:str1中前 i-1 個字符 與 str2中前j-1個字符中最長公共子序列的長度。          yii

  這時咱們要找出其動態轉移方程,分析 ( 要結合數組的意義理解 ) :
spa

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

      不然:d[i][j] = max{   dp[i-1][ j ]  ,dp[ i ][ j-1 ] };blog

3、代碼實現(c++)ci

     

#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;
	}
}
相關文章
相關標籤/搜索