将其划分为尽可能少的回文串
dp[i] = min(dp[i],dp[j] + 1) 来表示j+1~i是回文串
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 0x3f3f3f3f
using namespace std;
char p[1005];
bool work(int i,int j)
{
for(int k = 0; k <=(j-i)/2; k++)
if(p[i+k] != p[j-k])
return false;
return true;
}
int dp[1005];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
getchar();
scanf("%s",p);
int len = strlen(p);
for(int i = 0;i < len;i++)
dp[i] = i+1; //回文串为单个字母的情况
for(int i = 0;i < len;i++)
if(work(0,i))
dp[i] = 1; //包含首位的回文串
for(int i = 0; i < len; i++)
for(int j = 0; j < i; j++)
if(work(j+1,i)) //j+1 从第二位开始判断
dp[i] = min(dp[i],dp[j] + 1);
printf("%d\n",dp[len-1]);
}
return 0;
}
本文介绍了一种使用动态规划解决字符串最小回文子串划分的方法。通过遍历字符串并检查子串是否为回文,该算法有效地确定了将给定字符串分割成最少数量回文子串所需的最小分割数。
448

被折叠的 条评论
为什么被折叠?



