題目鏈結
題目大意:摺疊的定義如下: 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個...