Partitioning by Palindromes
求一串字符的的最小回文串划分的个数
简单题,先预处理有哪些回文串,技巧是枚举中心,然后想左右延申,要注意的是回文串的长度有奇数和偶数之分
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1110;
char a[maxn];
bool self[maxn][maxn];
int dp[maxn];//到i为止有的最少划分数
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%s", a + 1);
mem(self, 0);
int n = strlen(a + 1);
for (int i = 1; i <= n; i++)
{
for (int j = 0; i + j <= n && i - j >= 1; j++)//奇数长度回文串
{
if (a[i + j] == a[i - j])
self[i - j][i + j] = 1;
else
break;
}
for (int j = 0; i + 1 + j <= n && i - j >= 1; j++)//偶数长度回文串
{
if (a[i + 1 + j] == a[i - j])
self[i - j][i + 1 + j] = 1;
else
break;
}
}
for (int i = 0; i <= n; i++)
{
dp[i] = i;
}
for (int i = 1; i <= n; i++)
{
dp[i] = dp[i - 1] + 1;
for (int j = 1; j < i; j++)
{
if (self[j][i])
dp[i] = min(dp[j - 1] + 1, dp[i]);
}
}
printf("%d\n", dp[n]);
}
}