一道dp。如果字符串的长度为len,则从1 -> len 判断此长度最少能有多少个回文串。判断是否为回文串利用了记忆化,若果此前已经确认过它是否为回文串,直接返回结果便可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1000 + 5;
char s[maxn];
int vis[maxn][maxn];
int d[maxn];
int p[maxn][maxn];
int is_palindromes(int i, int j)
{
if(i >= j) return true;
if(s[i] != s[j]) return false;
if(vis[i][j] == 1) return p[i][j];
vis[i][j] = 1;
p[i][j] = is_palindromes(i + 1, j - 1);
return p[i][j];
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
memset(vis, 0, sizeof(vis));
scanf("%s", s + 1);
int len = strlen(s + 1);
for(int i = 1; i <= len; i++)
{
d[i] = i + 1;
for(int j = 0; j < i; j++)
{
if(is_palindromes(j + 1, i)) d[i] = min(d[i], d[j] + 1);
}
}
printf("%d\n", d[len]);
}
return 0;
}