题面
题意
将一个字符串拆成多个,使每一个都是回文串。
方法
因为长度小于等于1000,故
n
3
n^{3}
n3的算法会超时,应该用
n
2
n^{2}
n2的做法来做,若枚举在哪一个点将其拆成两半,必然超时。
dp[i]表示从首字符开始到i的次数,首先用n^2的做法枚举出回文串,并用这些回文串来更新dp:dp[j]=min(dp[j],dp[i-1]+1).
代码
#include<bits/stdc++.h>
#define N 1010
using namespace std;
char a[N];
int T,TT,len,dp[N];
bool P[N][N];
int main()
{
int i,j;
cin>>T;
TT=T;
while(T--)
{
scanf("%s",a+1);
len=strlen(a+1);
memset(P,0,sizeof(P));
for(i=1;i<=len;i++)
{
for(j=i;j<=len&&i*2-j>=1&&a[j]==a[i*2-j];j++)
{
P[i*2-j][j]=1;
}
for(j=i;2*i+1-j<=len&&j>=1&&a[j]==a[i*2+1-j];j--)
{
P[j][2*i+1-j]=1;
}
dp[i]=i;
}
for(i=1;i<=len;i++)
{
for(j=1;j<=len;j++)
{
if(P[i][j])
{
dp[j]=min(dp[j],dp[i-1]+1);
}
}
}
printf("Case %d: %d\n",TT-T,dp[len]);
}
}