P4302 SCOI2003 字串摺疊

2021-09-28 21:16:45 字數 1987 閱讀 7010

演算法:區間動態規劃

f [i

][j]

f[i][j]

f[i][j

]表示處理i到j

i到ji到

j這段區間所需要的最小代價

兩種轉移方法:

一.標準的區間dpdp

dp的轉移f[i

][j]

=min

(f[i

][j]

,f[i

][k]

+f[k

+1][

j]);

f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);

f[i][j

]=mi

n(f[

i][j

],f[

i][k

]+f[

k+1]

[j])

; 二.如果i

ii到j

jj這段區間可以摺疊

f [i

][j]

=min

(f[i

][j]

,f[i

][k]

+2+n

um[l

en/l

])

;f[i][j]=min(f[i][j],f[i][k]+2+num[len/l]);

f[i][j

]=mi

n(f[

i][j

],f[

i][k

]+2+

num[

len/

l]);

注意在可以摺疊中的括號也算字元,前面的數字要進行預處理,看看是一位數還是兩位數其中len

lenle

n表示i

ii到j

jj這段區間長度

l en

lenle

n可以被迴圈節整除

l

ll表示可以摺疊的迴圈節的長度,也就是i

ii到k

kk的長度

也不用擔心類似於abc

bcbc

abcbcbc

abcbcb

c這種情況,即使bcbc

bc這個迴圈節2

22無法整除7,但是在處理小區間2−7

2-72−

7的位置的時候是可以摺疊的,最後合併時就是取的摺疊後的最優值

#include

#define inf 100000000

#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

using

namespace std;

const

int maxn=

1e5+10;

const

int maxm=

1e3+10;

int n;

char s[maxn]

;int f[maxm]

[maxm]

,num[maxn]

;template

<

class

t>

inline

void

read

(t &x)

while

(isdigit

(ch)

) x*

=f;}

void

readdata()

bool

check

(char s,

int len,

int lenth)

return

true;}

void

init()

void

work()

rep(k,i,j-1)

}printf

("%d"

,f[1

][n]);

}int

main()

P4302 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 字串摺疊

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