BZOJ2121 字串遊戲

2021-07-29 12:41:18 字數 924 閱讀 4743

區間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]就代表了l~r,和第k個串的匹配情況,而且壓位下轉移十分方便,轉移後要嘗試跳一些可以完全刪去的區間轉移

當f[r][k],第length[k]位為1(即可以完全匹配)時c[l][r]=true

最後求出了所有c,再用乙個dp求最多刪去多少

code:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

inline

void up(int &x,const

int &y)

for(int k=1;k<=n;k++)}}

memset(ans,0,sizeof ans);

for(int i=1;i<=len;i++)

printf("%d\n",len-ans[len]);

return0;}



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 字串遊戲

雖然感覺神仙但是又感覺不神仙。對於刪除,一定是刪掉連續的一段的 如果可以預處理出某一段能不能被刪掉,我就很開心了 設f i j k u 表示給出的字串中,i到j和s集合第k個元素第u個字元是否匹配 轉移懶得寫了反正抄的 include include include include include ...