日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划 dp03 最长公共子串问题 c代码

發布時間:2025/4/5 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划 dp03 最长公共子串问题 c代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

若序列Z是序列X的子序列,又是Y的子序列,則稱Z是序列X與Y的公共子序列。例如序列"bcba"是序列"abcbdab"與"bdcaba"的公共子序列。 例如,給出序列X "hahafdreghsbacdba"和序列"acdbegshbdrabsa",如何求取這兩個序列的最長公共子序列?

這道題具有典型的最優子結構特性,即它的最優解一定包含子問題的最優解,這么看使用動態規劃來解決是比較合理的。動態規劃解題步驟通常由三個部分構成

1. 分階段。

2. 狀態遷移方程。

3. 尋找最優解。

對于這道題,字符數組a存儲序列X,數組b存儲序列Y,設i, j分別為數組a, b的指針。m[i][j]表示序列a[0] ~ a[i]與序列b[0]~b[j]的最長公共子序列,當a[i] == b[i]時,倆字符相等,最長公共子序列等于m[i-1][j-1] + 1; 如果字符不等,則

m[i][j] = MAX(m[i-1][j], m[i][j-1]);這個就是狀態遷移方程。得到了狀態遷移方程,在開始遞推之前,需要知道邊界情況,這里的邊界情況就是當i等于0時,對于任意的0 <= j <= len(b), m[i][j] = 0; 同理,當j = 0時,任意的0 <= i <= len(a), m[i][j] = 0。對于字符串而言,數組下標為0是有字符的,所以說這么算會帶來處理上的不方便,既然順序不方便那就是用倒序好了,假設m[i][j]表示序列a[i] ~ a[last]與序列a[j][last]的最長公共子序列長度,當i = len(a)的時候,任意的j值,m[i][j] = 0,這個也很好理解,i等于n,說明a里面沒有字符,這時候對于任意的j值,m[i][j] = 0,同理對于j = len(b),此時任意的i值,m[i][j] = 0。通常使用動態規劃解決問題的時候,都存在兩種遞推方式,順序遞推和逆序遞推,具體使用哪種根據具體問題來決定。

得到狀態遷移方程,就可以知道最優解了,即m[0][0];接下來就是打印最優解序列了,這個可以根據狀態遷移方程來判斷哪個字符在最優解序列中。

下面是該問題的c代碼實現:

//最長公共子串的動態規劃解法#include <stdio.h> #include <string.h>#define MAX(a, b) ((a) > (b) ? (a) : (b))void main() {int i, j, k, n, m[30][30] = {0};char astr[30+1] = "hsbafdreghsbacdba", bstr[30+1] = "acdbegshbdrabsa";n = strlen(astr);k = strlen(bstr);printf("string A : %s\n", astr);printf("string B : %s\n", bstr);//邊界初始化for (i = 0; i < n; i++)m[i][k] = 0;for (j = 0; j < k; j++)m[n][j] = 0;//狀態遞推for (i = n - 1; i >= 0; i--){for (j = k - 1; j >= 0; j--){if (astr[i] == bstr[j])m[i][j] = m[i+1][j+1] + 1;elsem[i][j] = MAX (m[i+1][j], m[i][j+1]);}}//打印最優解printf("最長公共子串長度為:%d\n", m[0][0]); for (i = 0; i < n;){for (j = 0; j < k;){if (astr[i] == bstr[j]){printf("%c", astr[i]);i++;j++;}else{if (m[i][j] == m[i+1][j])i++;elsej++;}}}printf("\n");return; }

?

參考資料:

1.?數據結構?: C語言版/ 嚴蔚敏,吳偉民編著

=============================================================================================

Linux應用程序、內核、驅動開發交流討論群(745510310),感興趣的同學可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。

總結

以上是生活随笔為你收集整理的动态规划 dp03 最长公共子串问题 c代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。