問題描述:給定兩個字串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函式,就換...