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