洛谷2679 子串(動態規劃)

2022-05-14 14:30:10 字數 846 閱讀 2408

點此看題面

大致題意:讓你從乙個字串中選擇\(k\)個互不重疊的非空子串,使其按序拼接恰好組成另乙個給定的字串,求方案數。

比較顯然,這可以用動態規劃解決。

考慮用\(f_\)表示在第乙個字串前\(i\)位中選擇\(t\)個子串組成第二個字串前\(j\)位,且選/不選(1/0)第\(i\)的方案數,並用\(g_\)記錄\(f_+f_\)。

則不難得出\(f_=g_\)。

而對於\(f_\)的轉移,就需要分類討論了:

當\(s1_i!=s2_j\),顯然該位不能選,故\(f_=0\)

當\(s1_i==s2_j\),則有兩種情況:新選乙個子串或不新選乙個子串。即\(f_=f_+g_\)。

大致思路就是如此簡單。

等等,陣列好像開不下?

\(hl666\)奆佬說:「滾存不就好了嗎!」

於是這題就做完了。

#include#define n 1000

#define m 200

#define xry 1000000007

#define inc(x,y) ((x+=(y))>=xry&&(x-=xry))

using namespace std;

inline int getsum(int x,int y)

int n,m,k,f[2][m+5][m+5][2],g[2][m+5][m+5];char s1[n+5],s2[m+5];

int main()

return printf("%d",g[n&1][m][k]),0;//輸出答案

}

洛谷 P2679子串

題目背景 無 題目描述 有兩個僅包含小寫英文本母的字串 a 和 b。現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a 中出現的順序依次連線起來得到一 個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出 的位置不同也認為是不同的方案。輸...

洛谷 P2679 子串

f i j p 0 1 表示b前j個字元由a的前i個字元分成p段,且a i 選或不選的方案數.1 當前a i 1 可以不選 f i 1 j 1 p 1 0 2 當前a i 與a i 1 在同一段上 f i 1 j 1 p 1 3 當前a i 與a i 1 不在同一段上 f i 1 j 1 p 1 1...

NOIP2015子串(洛谷2679)

標籤 dp 題目描述 有兩個僅包含小寫英文本母的字串 a 和 b。現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a中出現的順序依次連線起來得到一 個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出的位置不同也認為是不同的方案。輸入輸出...