1090 SCOI2003 字串摺疊

2021-07-28 22:21:16 字數 980 閱讀 5876

題目鏈結

題目大意:摺疊的定義如下: 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(1)不摺疊:f[

l][r

]=f[

l][k

]+f[

k+1]

[r]

(2)摺疊:f[

l][r

]=f[

l][k

]+2+

calc

((r−

l+1)

/(k−

l+1)

) ,要求k+1~r可以由l~k重複得到,其中2為括號長度,calc為總長度/迴圈節長度即係數所佔長度

答案即為f[

1][n

] 我的收穫:區……間dp

#include 

#include

#include

#include

#include

using

namespace

std;

const

int m=105;

char s[m];

int bit,f[m][m];

bool lyd(int l1,int r1,int l2,int r2)//

int get(int x)//求位數

int dp(int l,int r)

return f[l][r]=now;

}

void work()

int main()

1090 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 c 2 b aaaca...

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 字串摺疊

給出乙個字串,可以將相鄰的重複的子串合併在一起,如 abaaaabba,可以合併為ab4 a bba 注意,數字和括號均算作字元,數字有多少位就相當於有多少個字元 請問怎麼合併才能使字串的長度最小 也可以不合併 區間dp,本來想著會t,結果應該是不會詢問這麼多遍,所以耗時可觀 f i j 表示第i個...