動態規劃求最長公共子串行長度和子串行

2021-07-10 07:45:07 字數 1351 閱讀 7351

求兩個字串的最長公共子串行時,需要用到兩個陣列c[maxlen][maxlen],b[maxlen]maxlen],c[maxlen][maxlen]

用於記錄兩個字串的lcs(最長公共子串行)的長度,b[maxlen]maxlen]記錄回溯時搜尋方向,1表示上方,-1表示左方,0表示左上方。

動態轉移方程:

b[i][j]的方向與c[i][j]具體取哪個的值相同,例如c[i,j]=c[i,j-1],則b[i][j]=-1左方*/

#include

#include

#include

#define maxlen 1010

using namespace std;

/*求兩個字串的最長公共子串行時,需要用到兩個陣列c[maxlen][maxlen],b[maxlen]maxlen],c[maxlen][maxlen]

用於記錄兩個字串的lcs(最長公共子串行)的長度,b[maxlen]maxlen]記錄回溯時搜尋方向,1表示上方,-1表示左方,0表示左上方。

動態轉移方程:

char x[maxlen],y[maxlen];

int b[maxlen][maxlen],c[maxlen][maxlen];

void lcs(char *x,char *y,int m,int n,int b[maxlen][maxlen],int c[maxlen][maxlen])

else if(c[i-1][j]>=c[i][j-1])

else}}

}void printlcs(int b[maxlen][maxlen],char *x,int i,int j)

else if(b[i][j]==1)

printlcs(b,x,i-1,j);

else

printlcs(b,x,i,j-1);

}int main()

return 0;}

2、求長度

動態轉移方程 dp[x][y]=max

#include

#include

int dp[1010][1010];

int main()

else if(dp[i-1][j]>=dp[i][j-1])

dp[i][j]=dp[i-1][j];

else

dp[i][j]=dp[i][j-1];

}printf("%d\n",dp[lx][ly]); }

}

求最長公共子串行長度

1.求最長公共子串行 子串行可以不連續 這是一道動態規劃題,設二維陣列dp i j dp i j 表示a串前i個字元 包括第i個 與b串前j個字元 包括第j個 所有的公共子串行的最長長度。例如,a串abbcd,b串abcd,dp 3 3 就表示的a的前三個字元與b的前三個字元的最長公共子串行長度,值...

SDUT 最長公共子串行長度 動態規劃

time limit 1000 ms memory limit 65536 kib submit statistic problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文本母 a,z 表示序列x和y。out...

最長公共子串行長度以及列印(動態規劃入門)

poj1458原題鏈結 北大郭煒老師在mooc上講的 演算法基礎的例題 也是按照講的寫的 方法呢就是 串 a 以 i 為結尾和串 b 以 j 為結尾的最長公共子串行長度 maxlen i j max maxlen i j 1 maxlen i 1 j 當a的第i 1字元個和b的第j 1個字元一樣時 ...