dp[i]表示0~i最小的切割次数
从左向右遍历字符串,如果0~i是回文串 则dp为0,否则为i
对于每一个i,遍历i的子串
转移方程:
dp[i]=min(dp[i],dp[j-1]+1);
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool judge(string str)
{
int end=str.length()-1;
int start=0;
while(start<end)
{
if(str[start]==str[end])
start++,end--;
else return false;
}
return true;
}
int solve(string s)
{
int len=s.length();
vector<int> dp(len,0);
for(int i=0;i<len;i++)
{
dp[i]=judge(s.substr(0,i+1)) ? 0 : i;
if(dp[i])
{
for(int j=1;j<=i;j++)
{
if(judge(s.substr(j,i-j+1)))
dp[i]=min(dp[i],dp[j-1]+1);
else
dp[i]=min(dp[i],dp[j-1]+i-j+1);
}
}
}
return dp[len-1];
}
int main(int argc, char const *argv[])
{
int t;scanf("%d",&t);
while(t--)
{
string a;cin>>a;
cout<<solve(a)<<endl;
}
return 0;
}