C++動態(tài)規(guī)劃實現(xiàn)查找最長公共子序列
最長公共子序列
最長公共子序列(LCS)是一個在一個序列集合中(通常為兩個序列)用來查找所有序列中最長子序列的問題。一個數(shù)列 ,如果分別是兩個或多個已知數(shù)列的子序列,且是所有符合此條件序列中最長的,則稱為已知序列的最長公共子序列。
動態(tài)規(guī)劃:
采用二維數(shù)組flag來記錄下標(biāo)i和j的走向。數(shù)字"1"表示,斜向下;數(shù)字"2"表示,水平向右;數(shù)字"3"表示,豎直向下
問題描述: 設(shè)有字符串a(chǎn)[0…n],b[0…m],下面就是遞推公式。字符串a(chǎn)對應(yīng)的是二維數(shù)組num的行,字符串b對應(yīng)的是二維數(shù)組num的列。
代碼實現(xiàn)
#include<stdio.h> #include<string.h> char a[500],b[500]; char num[501][501]; ///記錄中間結(jié)果的數(shù)組 char flag[501][501]; ///標(biāo)記數(shù)組,用于標(biāo)識下標(biāo)的走向,構(gòu)造出公共子序列 void LCS(); ///動態(tài)規(guī)劃求解 void getLCS(); ///采用倒推方式求最長公共子序列 int main() { int i; strcpy(a,"ABCBDAB"); strcpy(b,"BDCABA"); memset(num,0,sizeof(num)); memset(flag,0,sizeof(flag)); LCS(); printf("%d\n",num[strlen(a)][strlen(b)]); getLCS(); return 0; } void LCS() { int i,j; for(i=1;i<=strlen(a);i++) { for(j=1;j<=strlen(b);j++) { if(a[i-1]==b[j-1]) ///注意這里的下標(biāo)是i-1與j-1 { num[i][j]=num[i-1][j-1]+1; flag[i][j]=1; ///斜向下標(biāo)記 } else if(num[i][j-1]>num[i-1][j]) { num[i][j]=num[i][j-1]; flag[i][j]=2; ///向右標(biāo)記 } else { num[i][j]=num[i-1][j]; flag[i][j]=3; ///向下標(biāo)記 } } } } void getLCS() { char res[500]; int i=strlen(a); int j=strlen(b); int k=0; ///用于保存結(jié)果的數(shù)組標(biāo)志位 while(i>0 && j>0) { if(flag[i][j]==1) ///如果是斜向下標(biāo)記 { res[k]=a[i-1]; k++; i--; j--; } else if(flag[i][j]==2) ///如果是斜向右標(biāo)記 j--; else if(flag[i][j]==3) ///如果是斜向下標(biāo)記 i--; } for(i=k-1;i>=0;i--) printf("%c",res[i]); }
結(jié)果
時間復(fù)雜度:
由于只需要填一個m行n列的二維數(shù)組,其中m代表第一個字符串長度,n代表第二個字符串長度,所以時間復(fù)雜度為O(m*n)。
到此這篇關(guān)于C++動態(tài)規(guī)劃實現(xiàn)查找最長公共子序列的文章就介紹到這了,更多相關(guān)C++最長公共子序列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題(典型問題)
這篇文章主要介紹了關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題,是一個非常典型的問題,本文通過實例舉例給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-02-02Qt5+QMediaPlayer實現(xiàn)音樂播放器的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Qt5和QMediaPlayer實現(xiàn)簡易的音樂播放器,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下2022-12-12C++實現(xiàn)職工工資管理系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)職工工資管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03window調(diào)用api列出當(dāng)前所有進(jìn)程示例
這篇文章主要介紹了window調(diào)用api列出當(dāng)前所有進(jìn)程示例,需要的朋友可以參考下2014-04-04c++實現(xiàn)對輸入數(shù)組進(jìn)行快速排序的示例(推薦)
下面小編就為大家?guī)硪黄猚++實現(xiàn)對輸入數(shù)組進(jìn)行快速排序的示例(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06