题目:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000
思路:d[i]为字符0~i划分成的最下回文串的个数,则d[i] = min{d[j] + 1|s[j + 1~i]是回文串}
先预处理s[i][j]是否为回文串
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
const int maxn = 1000 + 2;
char s[maxn];
int n,l,d[maxn];
bool is[maxn][maxn];
bool solve(int i,int j)
{
while(i < j)
{
if(s[i] == s[j])
{
i++;
j--;
}
else return false;
}
return true;
}
int main()
{
cin>>n;
while(n--)
{
scanf("%s",s + 1);
l = strlen(s + 1);
memset(d,INF,sizeof(d));
d[0] = 0;
for(int i = 1;i <= l;i++)
{
for(int j = i;j <= l;j++)
is[i][j] = solve(i,j);
}
for(int i = 1; i <= l; i++)
{
for(int j = 0; j < i; j++)
if(is[j + 1][i])
d[i] = min(d[i],d[j] + 1);
}
printf("%d\n",d[l]);
}
return 0;
}