bzoj 2121 字串遊戲 動態規劃

2021-07-11 05:37:47 字數 807 閱讀 4921

令dp[i][j][k][l]表示母串中左端點為i,右端點為j,能否刪到只剩下第k個字串的前l位,ok[i][j]表示母串i~j能否刪完,顯然有ok[i][j]=dp[i][j][k][len[k]]的並。兩種情況轉移一下即可。

注意dp[i[j][k][l]為bool且l只有21位於是可以把最後一位壓起來可以快很多。

另外我個人認為存在更優的寫法但是想不出來qaq。。。

ac**如下:

#include#include#includeusing namespace std;

int n,m,len[35],bin[25],p[155][35],dp[155][35],f[155];

char s[155],a[35][25]; bool ok[155][155];

int main()

bin[0]=1; for (i=1; i<=22; i++) bin[i]=bin[i-1]<<1;

for (i=1; i<=m; i++)

for (j=1; j<=n; j++)

for (k=1; k<=len[j]; k++) if (s[i]==a[j][k]) p[i][j]|=bin[k];

for (i=m; i; i--){

for (j=1; j<=n; j++) dp[i-1][j]=1;

for (j=i; j<=m; j++){

for (k=1; k<=n; k++){

dp[j][k]=(dp[j-1][k]<<1)&p[j][k];

for (x=i; x

by lych

2016.4.15

bzoj 2121 字串遊戲

題目大意 給你乙個大字串和乙個字串的集合,每次可以從字串的集合中選出乙個,如果那個大字串中包含了這個字串,就可以從大串中將小串刪掉,刪完後兩邊接起來,求刪完後大串最少剩幾個字元 大串 150,小串 20,小串個數 30 這題沒想著怎麼做,主要還是太弱了。首先可以設f i j k l 代表第i個到第j...

bzoj 2121 字串遊戲

bx正在進行乙個字串遊戲,他手上有乙個字串l,以及其他一些字串的集合s,然後他可以進行以下操作 對於乙個在集合s中的字串p,如果p在l中出現,bx就可以選擇是否將其刪除,如果刪除,則將刪除後l 成的左右兩部分合併。舉個例子,l abcdefg s 如果bx選擇將 de 從l中刪去,則刪後的l abc...

BZOJ2121 字串遊戲

區間dp 用c l r 表示l r是否能被全部刪掉,f l r k x 表示l r和第k個串匹配是否能匹配到第x位,注意到小串的長度 21,而且f是個bool變數,所以可以把x壓成int,而推一下f的轉移方程發現對於不同的l,他們之間是互不影響的,所以可以把l這一維刪掉 那麼列舉左端點,f r k ...