SCOI2003 字串摺疊(區間dp)

2022-04-30 09:57:13 字數 1230 閱讀 9547

摺疊的定義如下:

乙個字串可以看成它自身的摺疊。記作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:

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

考試的題目,還不會區間dp,什麼都不知道,考試的時候思路大概想到了,但是沒有想到怎麼實現。

用\(f[i][j]\)表示從第\(i\)個字元到第\(j\)個字元的最小長度。列舉中間斷點,一定要先處理完中間才能處理兩邊,考試的時候就是不曉得怎麼列舉(我還是太菜了)。

還有一點很容易錯的,字元摺疊起來前面的數字可能為不止佔一位(如aaaaaaaaaa ---> 10(a))。

難點在於怎樣判斷摺疊,看到網上很多大佬用%什麼的很麻煩,其實我們只要算出摺疊完後字母部分有多長,然後用當前位置減去長度就可以了。因為既然可以列舉到這裡,那麼前面一定保證了相同,這是我們沒必要一定搞到第乙個的位置去判斷。具體看**吧

#include#include#include#include#includeusing namespace std;

int len;

int f[110][110];

int dp[110];

char ch[110];

bool get(int x1,int y1,int x2,int y2)

return true;

}int cal(int k)

return qwe;

}int main()}}

cout

}

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