問題描述
摺疊的定義如下: 1. 乙個字串可以看成它自身的摺疊。記作s s 2. x(s)是x(x>1)個s連線在一起的串的摺疊。記作x(s) ssss…s(x個s)。 3. 如果a a』, bb』,則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。
題解引用hzwer
dp[l][r]表示l~r的最短摺疊長度即可推出:dp[l][r]=min(r-l+1,dp[l][k]+dp[k+1][r])l<=k當k+1~r可以由l~k重複得到時還要:dp[l][r]=min(dp[l][r],dp[l][k]+2+calc((r-l+1)/(k-l+1)));//calc用來計算乙個十進位制數所佔位數
答案就是dp[0][len-1];
#includeusingnamespace
std;
int f[110][110
];char s[110
];bool vis[110][110
];bool judge(int l,int r,int cl,int
cr)
return1;
}int
get(int
x)
returnt;}
int dp(int l,int
r) }
return f[l][r]=t;
}int
main()
BZOJ 1090 字串摺疊 區間DP
很明顯的區間dp,設dp l r 表示 l,r 區間的字串摺疊後的最小長度。可以通過兩種方向轉移,dp l r min dp l i dp i 1 r 另一種是摺疊,dp l r min dp l l k 1 cal r l 1 k 2 其中k是能整除 r l 1 的數且區間能夠摺疊成k份,cal ...
bzoj1090(區間dp,字串摺疊問題)
這個問題比上乙個簡單一點,應該對比一下兩題的相似與不同點,來找到解題的技巧 這題是用遞推實現的,不用記憶化。f l r 表示,把l r這個區間摺疊的最短長度,然後我們想,對於乙個區間來說,我們有兩種選擇,一種是把這個區間它自己來摺疊,另一種是兩塊已經摺疊的區間接起來。對於第二中情況,直接列舉斷點 兩...
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 ...