https://uva.onlinejudge.org/external/115/11584.pdf
题意:
给出t个字符串,求每个字符串至少有多少个回文
解题思路:
用dp[ i ]来记录到i为止,当前最少的回文数
两个for循环套在一起,形成一个区间(i,j),如果这个区间是一个回文,那么就比较dp[ i ]与dp[ j-1 ] + 1,取小的那一个
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
char str[1005];
int dp[1005];
bool judge(int x, int y)
{
while(x>=y)
{
if(str[x]!=str[y]) return false;
x--;
y++;
}
return true;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%s",str+1);
int len = strlen(str+1);
dp[0] = 0;
for(int i=1;i<=len;i++)
{
dp[i] = inf;
for(int j=i;j>=1;j--)
{
if(judge(i,j)) dp[i] = min(dp[i],dp[j-1]+1);
}
}
cout<<dp[len]<<endl;
}
return 0;
}