题目:Partitioning by Palindromes
题意:
来自luogu——
当一个字符串正序和反序是完全相同时,我们称之为“回文串”。例如“racecar”就是一个回文串,而“fastcar”就不是。现在给一个字符串s,把它分割成若干个互不相交的回文子串,求分割的回文子串的最少个数。
思路:
先用n^2的时间判断出所有子串。
令f[i]表示前i个字符分割的回文子串的最少个数,转移方程:f[i]=min(f[i],f[j-1]+1),其中[i,j]为一个回文串。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000
int n;
char str[maxn+5];
bool isp[maxn+5][maxn+5];
int f[maxn+5];
void readin() {
scanf("%s",str);
n=strlen(str);
}
void init(){
memset(isp,0,sizeof(isp));
for(int i=0;i<n;i++) {
isp[i+1][i+1]=true;
if(str[i]==str[i+1]) isp[i+1][i+2]=true;
}
for(int i=n-1;i>=0;i--){
for(int j=i+2;j<n;j++){
if(str[i]==str[j]&&isp[i+2][j]) isp[i+1][j+1]=true;
}
}
for(int i=1;i<=n;i++) f[i]=i;
}
int dp(){
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
if(isp[j][i]) f[i]=min(f[i],f[j-1]+1);
}
}
return f[n];
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
readin();
init();
int ans=dp();
printf("%d\n",ans);
}
return 0;
}