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) ssss…s(x個s)。 3. 如果a a』, bb』,則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。
僅一行,即最短的摺疊長度。
neercyesyesyesneercyesyesyes
14乙個最短的摺疊為:2(neerc3(yes))
分析:一開始覺得和bzoj1068差不多.用那道題的狀態去推狀態轉移方程發現不是那麼容易推.因為這裡括號必須要是匹配的,而那一題並不要求r,m匹配.
實際上這道題還要簡單一些,區間dp的基本狀態表示方法:f[l][r]就能夠轉移.
兩種方式:1.f[l][r] = min. 2.f[l][r] = min.這兩個轉移分別是將子區間合併和將字串摺疊.
#include #include#include
#include
using
namespace
std;
char s[110
];int n,f[110][110
];int cal(int
x)bool check(int l,int mid,int
r)
return
true;}
intmain()}}
printf(
"%d\n
",f[1
][n]);
return0;
}
BZOJ1090 SCOI2003 字串摺疊
給出乙個字串,可以將相鄰的重複的子串合併在一起,如 abaaaabba,可以合併為ab4 a bba 注意,數字和括號均算作字元,數字有多少位就相當於有多少個字元 請問怎麼合併才能使字串的長度最小 也可以不合併 區間dp,本來想著會t,結果應該是不會詢問這麼多遍,所以耗時可觀 f i j 表示第i個...
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 ...