SCOI2003 字串摺疊

2022-08-18 23:24:22 字數 1501 閱讀 5211

摺疊的定義如下:

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

一道挺不錯的區間dp,適合我這種入門級選手做.定義f[i][j]為區間[i,j]壓縮後的dp值,那麼有兩種狀態轉移:一,從[i,k],[k,j]直接轉移;二,從[i,k]進行壓縮轉移,$f[i,j]=f[i,k]+2+m[(j-i+1)/(k-i+1)]$,其中需滿足$(j-i+1)%(k-i+1)==0$.

#include#include

#include

#include

#include

#include

#include

#define r register

#define next exnt

#define debug puts("mlg")

using

namespace

std;

typedef

long

long

ll;typedef unsigned

long

long

ull;

typedef

long

double

ld;inline ll read();

inline

void

write(ll x);

inline

void

writesp(ll x);

inline

void

writeln(ll x);

ll n;

char wn,c[1000

];ll f[

150][150],m[120

];inline

bool

check(ll l,ll r,ll len)

return

true;}

intmain()}}

writeln(f[

1][n]);

}inline ll read()

while(ch>='

0'&&ch<='9'

)

return x*t;

}inline

void

write(ll x)

if(x<=9)

write(x/10);putchar(x%10+'0'

);}inline

void

writesp(ll x)

inline

void

writeln(ll x)

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

SCOI2003 字串摺疊

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

題目傳送門 dp 的實現也要下一下功夫,比如這題,知道轉移方程卻不會實現 定義f i j 為區間 i,j 摺疊的最短長度 然後就是區間 dp 的套路,列舉中間斷點,然後轉移 如何判斷能否摺疊,以及摺疊後的處理沒有想到 還要多加練習 include include include include de...