最長公共子串行

2022-02-27 05:19:12 字數 1407 閱讀 1378

也許更好的閱讀體驗

\(\mathcal\)

對於乙個長度為\(a\)的正整數序列\(b\),定義其乙個長度為\(c\left(0 < c \leq a\right)\)的非空子

序列為乙個長度為\(c\)的下標序列\(p_\),滿足\(1 \leq p_1 < p_2 < ⋯ < p_c \leq a\)。

子串行本身就是按照順序把對應的元素拿出來\(:b_,b_, ... b_\)

給定乙個長度為\(n\)的正整數序列\(s\)和乙個長度為\(m\)的正整數序列\(t\),同時再給

定乙個有\(k\)條邊的有向圖\(g\)。請你求出它們有多少個公共子串行,滿足把子序列

拿出來之後,對於任意相鄰兩個元素\((a, b)\),滿足在\(g\)中存在一條有向邊\(< a, b >\)

這裡子串行不同,定義為下標位置不同(即序列\(p\)不同)。

\(1 ≤ n, m ≤ 3000 ,0 ≤ k ≤ 10^6 ,∀1 ≤ i ≤ n, 1 ≤ s[i] ≤

10^9, ∀1 ≤ i ≤ m, 1 ≤ t[i] ≤ 10^9, 1 ≤ s, t ≤ 10^9\)

\(\mathcal\)

考慮和求最長公共子串行類似的dp方式,先固定乙個公共子串行的末端為ai,然後列舉bj 找到bj時將前面允許的合法轉移加上即可

考試時腦子抽了,打了個樹狀陣列,列舉邊,但是ai被固定只需用鄰接表檢視即可

\(\mathcal\)

/*******************************

author:morning_glory

lang:c++

created time:2023年10月09日 星期三 08時13分00秒

*******************************/

#include #include #include using namespace std;

const int maxn = 6005;

const int mod = 1000000007;

//}cin;

//}}}

int n,m,k,tot,ans;

int a[maxn],b[maxn],c[maxn],f[maxn];

bool mp[maxn][maxn];

inline void add (int &x,int y)

inline int lsh (int x)

int main()

for (int i=1;i<=n;++i)

} printf("%d\n",ans);

return 0;

}

如有**講得不是很明白或是有錯誤,歡迎指正

如您喜歡的話不妨點個贊收藏一下吧

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...

最長公共子串 最長公共子串行

子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...