也許更好的閱讀體驗
\(\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...