NOIP2015提高組 子串 DP

2021-08-10 05:35:43 字數 882 閱讀 6142

題目描述

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

簡單dp。狀態表示以及轉移見**。

#include

using

namespace

std;

#define ll long long

#define pa pair

const

int maxn=1010,maxm=210,maxk=210,mod=1e9+7;

const

int inf=2147483647;

int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m,k,pos[26][maxm],len[26];

char a[maxn],b[maxm];

int f[maxm][maxk],g[2][maxm][maxk];

//f[j][k] b串匹配到j 分了k段 的方案數

//g[j][k] b串匹配到j 分了k段 且上一位有選的方案數

int main()

int lim1=min(i,m),lim2=min(i,k);

for(int j=0;j<=lim1;j++)

for(int k=0;k<=lim2;k++)

f[j][k]=(f[j][k]+g[now][j][k])%mod;

}printf("%d",f[m][k]);

}

NOIP2015提高組 子串

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

NOIP2015提高組 子串

看到方案數問題直覺就能想到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 ...

NOIP2015提高組T2 子串

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