一.題目描述
在字母表上分別給出兩個長度為m和n的字串x和y,確定在x和y中的最長公共子串行。例如,x為「abcbdab」,y為「bdcaba」,則兩者的最長公共子串行為bdab。
二.思路分析
假設兩個字串為x1,x2…xi和y1,y2…yj,再令l【i,j】表示這兩個的最長公共子串行。思路如下:如果xi==yj(即最後乙個字母相等),則,l[i,j]=l【i-1,j-1】+1.如果xi!=yj,則,l【i,j】=max.
說白了就是,如果最後乙個字母相等,則最長子序列等於前面的子串行再加上最後這個相等的。如果不想等,就在兩者間取個最大的(或者理解為,平移)。
其實最根本的思想就是遞迴。當然這是動態規劃的思想。動態規劃與遞迴的區別在於,為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是動態規劃法所採用的基本方法。
三.**實現
#include;
#include;
using
namespace
std;
#define maxlen 100
void lcslength(char *x,char*y,int m,int n,int c[maxlen],int b[maxlen])
for(int i=1;i<=n;i++)
for(int i=1;i<=m;i++)
else
if(c[i][j-1]>=c[i-1][j])
else }}
}void printlcs(char*x,int m,int n,int b[maxlen])
else
if(b[m][n]==1)
else printlcs(x,m-1,n,b);
}int main()
最長子序列 動態規劃
最長子序列可以說是剛接觸動態規劃的人經常遇見也不得不解決的問題,最常見的有兩種,一種是最長公共子串行 lcs 還有乙個是最長上公升子串行 lis 今天我就總結下這兩個的做法。一 最長公共子串行 lcs 題目描述 給你兩個陣列,可以是數字的,也可以是字串,我們假設是數字的!舉個例子 x 1,5,6,4...
單調遞增最長子序列(動態規劃)
求乙個字串的最長遞增子串行的長度 如 dabdbf最長遞增子串行就是abdf,長度為4 第一行乙個整數0輸出字串的最長遞增子串行的長度 3 aaaababc abklmncdefg 137 ac 1 include2 include 3 include4 using namespace std 5c...
求單調遞增最長子序列(動態規劃)
題目描述 求乙個字串的最長遞增子串行的長度 如 dabdbf最長遞增子串行就是abdf,長度為4 輸入 乙個字串,該字串的長度不會超過10000 輸出 輸出字串的最長遞增子串行的長度 樣例輸入 aaa ababc abklmncdefg 樣例輸出 1 3 7 解題思路 從前往後遍歷,計算每乙個字元處...