演算法:區間動態規劃
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 ...