給出字串a和b,在a中取\(k\)個不重疊的子串,按原來的順序排列後與b相同,求方案數
dp設\(f[i][j][p]\)為a字串匹配到\(i\),b字串匹配到\(j\)時,取\(p\)個子串且\(a_i\)為最後一位匹配成功的方案數,很好轉移
為了求答案,我們需要\(f\)關於\(i\)的字首和,定義為\(g\),有\(f[i][j][p]=\sum_lg[i-l][j-l][p-1]\)
遞推優化\(f[i][j][p]=f[i-1][j-1][p]+g[i-1][j-1][p-1]\)
因為只和上一項有關,所以可以優化成二維
#include#define int long long
using namespace std;
const int n=1010,m=210,mod=1000000007;
int f[n][m],n,m,k,g[n][n];
char a[n],b[m];
signed main()
cout
}
洛谷P2679 NOIP2015 子串
無 有兩個僅包含小寫英文本母的字串 a 和 b。現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a 中出現的順序依次連線起來得到一 個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出 的位置不同也認為是不同的方案。輸入格式 輸入檔名為 ...
NOIP2015子串(洛谷2679)
標籤 dp 題目描述 有兩個僅包含小寫英文本母的字串 a 和 b。現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a中出現的順序依次連線起來得到一 個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出的位置不同也認為是不同的方案。輸入輸出...
洛谷 2679 NOIP 2015 子串
題目戳這裡 一句話題意 給你兩個字串a,b從a中取出k個不重合子串 順序與在a中順序相同 組成b,問有多少種方案?solution 話說重打還是出各種錯誤也是醉了 先看題目,因為答案與a串,b串和拆分次數都有關,那麼我們把這些都定義進dp方程中 定義f i j k 0 代表選到a串的前i個字元中選k...