最長公共子串行長度 C 動規入門

2021-10-19 07:31:15 字數 1258 閱讀 3968

問題描述:給定兩個字串a和b,求乙個字串,使得該字串為a和b的最長公共子串行,求該字串的長度

樣例輸入:

sadstory adminsorry

樣例輸出:

6樣例解釋:

最長公共序列為adsory,長度為6

討論一下,以從後往前縮短的方法,

情況1:兩個字串末尾的字元相同,下一步即求同時裁去兩個字串的末尾字元後的最長公共子串行,屬於減而治之的情況:

情況2:兩個字串末尾字元不同,則為分而治之,即分別求出只裁剪乙個字串末尾後的最長公共子串行:

我的**示意如下:

#include

#include

using

namespace std;

int max=0;

void

f(string one,string two,

int a,

int b,

int max)

if(one[a-1]

==two[b-1]

)else

}int

main()

以dp[i][j]表示a[i]與b[j]之前的最長公共子串行長度

則:情況1:a[i]==b[j]

那麼dp[i][j]=dp[i-1][j-1]+1;

情況2:a[i]!=b[j]

則dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

我的**示意如下:

//動規版本 

/*這裡我開的dp陣列比實際需要大一:

一是i==0||j==0時防止越界,

二是i和j的數字對應即位此時處理的真實位置,方便理解吧(個人角度)*/

#include

#include

using

namespace std;

intmain()

}for

(int i=

1;i<=a.

length()

;i++

)else}}

cout<

length()

][b.

length()

];return0;

}

筆者較菜,若有不當,請不吝指教

求最長公共子串行長度

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...

3 1 最長公共子串行長度 15分

求兩個字串的最長公共子串行長度。輸入格式 輸入長度 100的兩個字串。輸出格式 輸出兩個字串的最長公共子串行長度。輸入樣例1 abcbdab bdcaba 輸出樣例1 輸入樣例2 abacdef pghik 輸出樣例2 動態規劃問題 主要是處理好邊界以及狀態轉移方程。pat不可以用gets函式,就換...