題意:求兩個串的最長公共子串行
**中的dp[i][j]表示0到i-1跟0到j-1的最長公共子串行
空間變化圖如下:
分析如下:
**1.**dp[i][j]=dp[i-1][j-1]+1;(a[i]==b[j])
(因為加和都是要和他前一項的基礎上加和所以是dp[i-1][j-1])
**2.**dp[i][j]=max(dp[i-1][j],dp[i][j-1])(a[i]!=b[j]);
(保留當前狀態方便下一字母比較)
**3.**n由於dp(i,j)只和dp(i-1,j-1), dp(i-1,j)和f(i,j-1)有關, 而在計算dp(i,j)時, 只要選擇乙個合適的順序, 就可以保證這三項都已經計算出來了, 這樣就可以計算出dp(i,j). 這樣一直推到dp(len(a),len(b))就得到所要求的解了.
**如下:
#include
#include
#include
using
namespace
std;
const
int maxn=5005;
int dp[maxn][maxn];
string a,b;
int main()
} cout
0;}
最大公共子串行
對於兩個字串,請設計乙個高效演算法,求他們的最長公共子串行的長度,這裡的最長公共子串行定義為有兩個序列u1,u2,u3.un和v1,v2,v3.vn,其中ui給定兩個字串a和b,同時給定兩個串的長度n和m,請返回最長公共子串行的長度。保證兩串長度均小於等於300。測試樣例 1a2c3d4b56 10...
最大公共子串行,最大公共子串,最大回文子串
1 兩個字串中最長公共子串行 該問題是動態規劃的經典問題,找出的公共序列不一定是連續的,參考資料很多,這裡就貼出公式和 做個簡單的筆記。設序列a,b的長度分別為n和m,l i,j 為a i b j 的最長公共子串行長度,有遞推公式 時間複雜度為o mn 如下 define n 50 intlcs c...
最大公共子串 DP
最大公共子串長度問題就是 求兩個串的所有子串中能夠匹配上的最大長度是多少。比如 abcdkkk 和 baabcdadabc 可以找到的最長的公共子串是 abcd 所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的思路,並補全劃線部分缺...