题意:划分回文串,求出一个字符串的最小回文串个数。
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<string>
using namespace std;
int s[1000 + 10][1000 + 10];
string str;
void init() {
for (int i = 0; i < str.length(); i++) {
int l = i, r = i;
while (l >= 0 && str[l] == str[r]) {
s[l][r] = 1;
l--; r++;
}
l = i, r = i+1;
while (l>=0&&str[l] == str[r]) {
s[l][r] = 1;
l--; r++;
}
}
}
int d[1010];
void dp() {
for (int i = 0; i < str.length(); i++) {
if(i>0)d[i] = d[i - 1] + 1;
else d[0] = 1;
for (int j = -1; j < i; j++) {
if (s[j+1][i]) {
if (j == -1)d[i] = 1;
else
d[i] = min(d[i], d[j] + 1);
}
}
}
}
int main()
{
int n;
while (cin >> n && n) {
for (int i = 0; i < n; i++) {
cin >> str;
memset(d, 0, sizeof(d));
memset(s, 0, sizeof(s));
init();
dp();
cout << d[str.length() - 1] << endl;
}
}
return 0;
}