题目链接:https://vjudge.net/contest/232314#problem/I
思路:dp(l,r)表示子串str(l,r)的最短折叠子串长度,且用一个string类型的二维数组sub[l][r],表示原串str的子串l~r,这样,转移方案如下:
1.边界条件:l==r,则子串长度就是1,dp[l][r]=1
2.L<R的时候,很明显有最优子区间的结构特点,将区间切分成两部分,分别折叠后合并,取最小的长度就是答案,用公式表示就是dp(l,r)=min{dp(l,k)+dp(k+1,r)},k就是我们需要的最小分割位置编号。
对于每个子串,都是要判断str(l,r)是否为周期串,首先求出最小重复串长度rep(0<rep<=(r-l+1)/2),再将DP(L,R)变为DP【L】【L+rep-1】的rep次折叠。
最后,答案就是DP(0,n-1)
代码:
#include<iostream>
#include<cstdio>
#include<sstream>
#include<cmath>