题目大意:给你一个字符串,问你最少能分为几个连续的回文串。
思路:简单DP,用d[ i ] 表示从头到i这个位置最少能分为几个,状态方程为 d[ i ] = min(d[ j ]+1,j<i&&str[j+1~i]是回文串)。
先开始想到这个,一算复杂度,感觉有点太高了,会TLE,还上网看了下别人的,一看人家AC代码思路和我一样,复杂度也是这个,就果断马上敲了,50ms就过了,囧。。 唉,有时候真不能太纠结于复杂度,很少有这种极限数据的。。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF = 0x0fffffff ;
char str[1111];
int is(int i,int j )
{
while(i<j)
{
if(str[i]!=str[j])
return 0;
i++;
j--;
}
return 1;
}
int d[1111];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",str+1);
int len = strlen(str+1);
d[0]=0;
for(int i = 1 ;i<=len;i++)
{
d[i] = INF;
for(int j = i-1;j>=0;j--)
{
if(is(j+1,i))
d[i] = min(d[i],d[j]+1);
}
}
printf("%d\n",d[len]);
}
return 0;
}