BZOJ1090 SCOI2003 字串摺疊

2022-05-19 21:41:05 字數 857 閱讀 6264

給出乙個字串,可以將相鄰的重複的子串合併在一起,如:abaaaabba,可以合併為ab4(a)bba

注意,數字和括號均算作字元,數字有多少位就相當於有多少個字元

請問怎麼合併才能使字串的長度最小(也可以不合併)

區間dp,本來想著會t,結果應該是不會詢問這麼多遍,所以耗時可觀

f[i][j]表示第i個字元到第j個字元所組成的子串合併後的最短長度

一般情況下f[i][j]=min(f[i][j],f[i][k]+f[k+1][j])

如果可以合併呢?

那我們就列舉將要合併的子串長度,然後找開頭結尾,然後判斷是否為迴圈串,如果是的話,就加多一步操作:

f[i][j]=min(f[i][j],f[i][k]+2+calc(i,k,j))calc表示這個迴圈節迴圈的次數的位數

最後輸出f[1][n]就行了,n表示整個串的長度

#include#include

#include

#include

#include

using

namespace

std;

char st[110

];int f[110][110

];bool check(int l,int mid,int

r)

return

true;}

int calc(int l,int mid,int

r)

return

tt;}

intmain()}}

printf(

"%d\n

",f[1

][n]);

return0;

}

bzoj1090 SCOI2003 字串摺疊

time limit 10 sec memory limit 162 mb submit 1718 solved 1146 submit status discuss 摺疊的定義如下 1.乙個字串可以看成它自身的摺疊。記作s s 2.x s 是x x 1 個s連線在一起的串的摺疊。記作x s sss...

BZOJ1090 SCOI2003 字串摺疊

摺疊的定義如下 1.乙個字串可以看成它自身的摺疊。記作 s s 2.x s 是 x x 1 個 s 連線在一起的串的摺疊。記作 x s ssss s x 個 s 3.如果 a a b b 則 ab a b 例如,因為 3 a aaa 2 b bb 所以 3 a c2 b aaacbb 而 2 3 a...

1090 SCOI2003 字串摺疊

題目鏈結 題目大意 摺疊的定義如下 1.乙個字串可以看成它自身的摺疊。2.x s 是x x 1 個s連線在一起的串的摺疊,記作x s 3.摺疊可以巢狀。給乙個字串,求它的最短摺疊。題解 區間dp f l r 表示 l r 壓縮後最短長度,初始值f l r r l 1 轉移 列舉區間分割點k,l k ...