SCOI2003 字串摺疊 區間DP

2022-04-30 10:21:09 字數 1240 閱讀 9157

摺疊的定義如下:

乙個字串可以看成它自身的摺疊。記作s = s

x(s)是x(x>1)個s連線在一起的串的摺疊。記作x(s) = ssss…s(x個s)。

如果a = a』, b = b』,則ab = a』b』 例如,因為3(a) = aaa, 2(b) = bb,所以3(a)c2(b) = aaacbb,而2(3(a)c)2(b) = aaacaaacbb

給乙個字串,求它的最短摺疊。例如aaaaaaaaaabababccd的最短摺疊為:9(a)3(ab)ccd。

輸入格式:

僅一行,即字串s,長度保證不超過100。

輸出格式: 

僅一行,即最短的摺疊長度。

輸入樣例#1: 

neercyesyesyesneercyesyesyes

輸出樣例#1: 

14

乙個最短的摺疊為:2(neerc3(yes))

這道題屬於很典型的區間dp.

狀態定義:

f[ i ][ j ] 表示從i 到 j 的最小長度.

前導狀態:

f [ i ][ j ] 初始化為原長 j - i +1.

f [ i ][ k ] 和 f[ k+1 ][ j ] 列舉斷點並且更新.

如果要實現合併操作的話.

我們列舉的兩個區間要滿足幾個條件:

1. 後面 的區間長度要整除前面合併的第一項長度 (因為合併都是從前面開始所以只需考慮後區間被前區間合併)

2. 後面的區間每一段都與其相同.

對於這個,我們直接暴力即可實現.

然後在 hzwer 學長那裡學了乙個高階的列舉. 無需擔心區間邊界問題 ! 遞迴實現 !

#includeusing

namespace

std;

char ch[101

];int f[101][101

];bool vich[101][101

];bool judge(int l,int r,int cl,int

cr)int cal(int

x)return

ans;}

//cal 為合併後數字的長度

int ans(int l,int

r)

return

f[l][r];

} int

main()

SCOI 2003 字串摺疊(區間 dp)

求乙個字串的最短可巢狀壓縮長度。如aaaaaaaaaabababccd最短為9 a 3 ab ccd。1 s 100 1 leq s leq 100 1 s 100對於乙個字串,令 fi,jf fi,j 為 i,j i,j i,j 的最短壓縮長度,有三個壓縮。原串形式,將 fi,jf fi,j 賦初...

SCOI2003 字串摺疊(區間dp)

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

SCOI2003 字串摺疊

scoi2003 字串摺疊 時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld摺疊的定義如下 乙個字串可以看成它自身的摺疊。記作s s x s 是x x 1 個s連線在一起的串的摺疊。記作x s ssss s x個s...