點此看題面
大致題意:讓你從乙個字串中選擇\(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 相等?注意 子串取出的位置不同也認為是不同的方案。輸入輸出...