NOIP2015提高組 子串

2022-06-03 04:57:14 字數 676 閱讀 6748

看到方案數問題直覺就能想到dp,考慮用f(i,j,k)表示a[1...i]取k個子串組成b[1...j]的方案數,發現很難轉移,因為不知道之前的方案哪些是還能拼接到結尾的,產生了前效性。

考慮加一維,即

a[1...i]取k個子串組成b[1...j],且末尾子串還可以繼續拼接的方案數為:f(i,j,k,0)=

a[1...i]取k個子串組成b[1...j],且末尾子串已經封閉或末尾根本不是子串的方案數為:f(i,j,k,1)=sum

其實就是f(i,j,k,1)=用這個字元然後封閉f(i,j,k,0)+不用這個字元f(i-1,j,k,1)

特別的,f(i,0,0,1)=1

#include #include 

using

namespace

std;

typedef

long

long

llint;

llint n, m, kk;

string

a, b;

const llint c = 1e9 + 7

;llint dp[

2][205][205][2

];int

main()}}

cout

<< dp[n & 1][m][kk][1]

}

NOIP2015提高組 子串

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

NOIP2015提高組 子串 DP

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

NOIP2015提高組T2 子串

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