题目描述:
题意就是分割字符串,使分割后的每一个字符串都是回文串,求分割后的最小串数。
一个十分暴力的DP,直接枚举终点的起点,判断该串是否回文,然后状态转移dp[j]=min(dp[j],dp[i-1]+1);
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include"stdlib.h"
using namespace std;
const int MAXM=50010;
string s;
int dp[MAXM];
bool check(int x,int y)
{
bool flag=true;
for (int i=x;i<=y;i++)
{
if (s[i]!=s[y])
{
flag=false;
break;
}
y--;
}
return flag;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
cin>>s;
int len=s.size();
for (int i=0;i<len;i++)
dp[i]=i+1;
for (int j=1;j<len;j++)
{
for (int i=0;i<=j;i++)
if (check(i,j))
{
dp[j]=min(dp[j],dp[i-1]+1);
}
}
printf("%d\n",dp[len-1]);
}
return 0;
}