給出乙個字串,可以將相鄰的重複的子串合併在一起,如:abaaaabba,可以合併為ab4(a)bba
注意,數字和括號均算作字元,數字有多少位就相當於有多少個字元
請問怎麼合併才能使字串的長度最小(也可以不合併)
區間dp,本來想著會t,結果應該是不會詢問這麼多遍,所以耗時可觀
f[i][j]表示第i個字元到第j個字元所組成的子串合併後的最短長度
一般情況下f[i][j]=min(f[i][j],f[i][k]+f[k+1][j])
如果可以合併呢?
那我們就列舉將要合併的子串長度,然後找開頭結尾,然後判斷是否為迴圈串,如果是的話,就加多一步操作:
f[i][j]=min(f[i][j],f[i][k]+2+calc(i,k,j))calc表示這個迴圈節迴圈的次數的位數
最後輸出f[1][n]就行了,n表示整個串的長度
#include#include#include
#include
#include
using
namespace
std;
char st[110
];int f[110][110
];bool check(int l,int mid,int
r)
return
true;}
int calc(int l,int mid,int
r)
return
tt;}
intmain()}}
printf(
"%d\n
",f[1
][n]);
return0;
}
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 字串摺疊
摺疊的定義如下 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 ...