bzoj 2121 字串遊戲

2021-07-07 05:34:05 字數 967 閱讀 8580

bx正在進行乙個字串遊戲,他手上有乙個字串l,以及其他一些字串的集合s,然後他可以進行以下操作:對於乙個在集合s中的字串p,如果p在l中出現,bx就可以選擇是否將其刪除,如果刪除,則將刪除後l**成的左右兩部分合併。舉個例子,l='abcdefg' , s=,如果bx選擇將'de'從l中刪去,則刪後的l='abcfg'。現在bx可以進行任意多次操作(刪的次數,順序都隨意),他想知道最後l串的最短長度是多少。

f[i][j][k][p]表示i到j是否可以表示第k個字串的前p個字元。

c[i][j]表示i到j是否可以全部刪去。

有兩種轉移『

f[j-1][k][p-1]&&st[k][p]==s[j]

f[d][k][p]&&c[d+1][j]

類似區間dp的東西可以採用固定一端,列舉另一端的方法

#include

#include

#include

#include

#include

#define ll long long

#define inf 1e9

#define eps 1e-10

#define md

#define n

using namespace std;

bool f[170][35][25],c[170][170];

int dp[170],len[35];

char s[170],st[35][25];

int main()

for (int i=lth;i;i--)

}for (int j=i;j<=lth;j++)

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

c[i][j]|=f[j][k][len[k]];

}for (int i=1;i<=lth;i++)

printf("%d\n",dp[lth]);

return 0;

}

bzoj 2121 字串遊戲

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

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 ...

bzoj2121 字串遊戲

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